Programming/ActiveX
[펌] 타입정보(tlb,dll)를 이용한 C++에서의 컴포넌트(Component) 사용방법
smok95
2008. 4. 22. 12:24
반응형
2. #import 전처리 명령어로 타입정보파일 참조
inline HRESULT IBlockSocket::Connect ( _bstr_t strIP, long lPort ) {
-> 프로젝트명.tlh, 프로젝트명.tli (output 디렉토리에 생성됨)
파일들이 자동 생성됨
-> 이 파일들은 클라이언트 프로그램 컴파일시 자동 참조된다.
프로젝트명.tlh 파일 -> 컴포넌트의 CLSID, 인터페이스에 대한 class 헤더, IID, 스마트 포인터의 구현을 포함
// 프로젝트명.tlh
struct __declspec(uuid("ffaa434b-f6f5-4029-96fb-8876893c9eaa")) IBlockSocket;
…
_COM_SMARTPTR_TYPEDEF(IBlockSocket, __uuidof(IBlockSocket));
…
struct __declspec(uuid("ffaa434b-f6f5-4029-96fb-8876893c9eaa"))
IBlockSocket : IDispatch
{
…
}
…
struct __declspec(uuid("bf9b9364-386a-4527-a03d-9254f59f5b9b")) BlockSocket;
프로젝트명.tli 파일 -> 인터페이스의 메서드 호출을 Wrapping한 대응 메서드들을 구현
HRESULT _hr = raw_Connect(strIP, lPort);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}
이러한 정보를 이용 인터페이스 포인터 선언 후 CoCreateInstance()함수를 호출하여 시스템에 등록된 컴포넌트 객체를 동적으로 생성한다.
주의) 프로젝트명.h를 이용한 방법과는 달리 타입정보를 이용한 사용에서는 메서드 호출시 반듯이 try, catch로 에러 핸들링 해준다. 그렇지 않으면 Wrapping 메서드에서 _com_issue_errorex()를 이용하여 에러객체를 throw하기 때문에 이를 핸들링 하지 않으면 런타임 에러가 발생한다.
#import "DiSSockets.tlb" no_namespace named_guids
…
IBlockSocket *pISocket = NULL;
hr = ::CoCreateInstance(__uuidof(BlockSocket)
, NULL
, CLSCTX_INPROC_SERVER
, __uuidof(IBlockSocket)
, (void**)&pISocket);
try
{
pISocket->Connect(CComBSTR("127.0.0.1"), 5000);
}
catch(_com_error& e)
{
…
}
반응형