Visual C++ 익스텐션 예제
이 프로그램은 필드에서 값을 검색하고 C/C++ 변수로 변환하는 방법을 보여 줍니다.
이 예제에서는 IADORecordBinding 인터페이스에 대한 QueryInterface
호출 및 참조 횟수의 COM 관련 세부 정보를 자동으로 처리하는 "스마트 포인터"도 활용합니다.
스마트 포인터가 없으면 다음을 코딩합니다.
IADORecordBinding *picRs = NULL;
...
TESTHR(pRs->QueryInterface(
__uuidof(IADORecordBinding), (LPVOID*)&picRs));
...
if (picRs) picRs->Release();
스마트 포인터를 사용하면 다음 문을 사용하여 IADORecordBinding
인터페이스에서 IADORecordBindingPtr
형식을 파생합니다.
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
그리고 다음과 같이 포인터를 인스턴스화합니다.
IADORecordBindingPtr picRs(pRs);
Visual C++ 확장은 Recordset 개체에 의해 구현되므로 스마트 포인터의 생성자, picRs
는 _RecordsetPtr
포인터, pRs
를 사용합니다. 생성자는 IADORecordBinding
인터페이스를 찾기 위해 pRs
를 사용하여 QueryInterface
를 호출합니다.
// Visual_Cpp_Extensions_Example.cpp
// compile with: /EHsc
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }
class CCustomRs : public CADORecordBinding {
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname, sizeof(m_ch_fname), m_ul_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname, sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
CHAR m_ch_fname[22];
CHAR m_ch_lname[32];
ULONG m_ul_fnameStatus;
ULONG m_ul_lnameStatus;
};
int main() {
::CoInitialize(NULL);
try {
_RecordsetPtr pRs("ADODB.Recordset");
CCustomRs rs;
IADORecordBindingPtr picRs(pRs);
pRs->Open(L"SELECT * FROM Employee ORDER BY lname", L"dsn=DataPubs;Trusted_Connection=yes;", adOpenStatic, adLockOptimistic, adCmdText);
TESTHR(picRs->BindToRecordset(&rs));
while (!pRs->EndOfFile) {
// Process data in the CCustomRs C++ instance variables.
printf("Name = %s %s\n",
(rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: "<Error>"),
(rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: "<Error>") );
// Move to the next row of the Recordset. Fields in the new row will
// automatically be placed in the CCustomRs C++ instance variables.
pRs->MoveNext();
}
}
catch (_com_error &e ) {
printf("Error:\n");
printf("Code = %08lx\n", e.Error());
printf("Meaning = %s\n", e.ErrorMessage());
printf("Source = %s\n", (LPCSTR) e.Source());
printf("Description = %s\n", (LPCSTR) e.Description());
}
::CoUninitialize();
}