ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [펌] 타입정보(tlb,dll)를 이용한 C++에서의 컴포넌트(Component) 사용방법
    Programming/ActiveX 2008. 4. 22. 12:24
    2. #import 전처리 명령어로 타입정보파일 참조
       -> 프로젝트명.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한 대응 메서드들을 구현
     
    inline HRESULT IBlockSocket::Connect ( _bstr_t strIP, long lPort ) {
        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)
    {
         
         } 
Designed by Tistory.