본문 바로가기
Programming/Tips(C++,C#)

Chapter 06. Visual C++ 컴파일러

by 곰네Zip 2014. 11. 10.

6.1 COM지원 VC++컴파일러 개요.

  - VC++컴파일러는 COM컴포넌트의 형식라이브러리를 읽어 이를 컴파일 가능한 C++코드로 변환해준다. VC++에서 COM을 지원하기 위한 예약어는 다음과 같다.

     + #import, __Declspec, __uuidof, _com_ptr_t, _com_error, _bstr_t, _variant_t, 전역함수

  - 이제까지 해왔던 COM객체의 CLSID를 얻어오는 과정을, #import "progID"로 해결 가능하다. 

  - IHelloPtr pIHello( __uuidof(Hello));

    위 구문은 다음과 같다.

 IUnknown* pUnk = NULL;

 IHello* pIHello = NULL;

 hr = ::CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&pUnk);

 pUnk->QueryInterface(IID_IHello, (void**)&pIHello);

    또한, AddRef, Release를 신경쓰지 않아도 된다.

   - 그리고 COM관련 에러는 _com_error를 try/catch로 묶어주면 된다.

 

6.2 형식 라이브러리

  - COM객체가 노출하는 인터페이스 정보를 COM객체가 제공하는 소스코드에 의존했었다. 그러나 형식 라이브러리를 사용하면, 소스코드를 제공받지 않아도 된다. 형식라이브러리는 IDL에 형식라이브러리 정보를 저장해야 한다.

 

6.3 #import지시어

  - import지시어는 형식라이브러리에서 정보를 읽어 COM객체와 인터페이스가 기술된 C++파일로 변환하여준다. 사용방법은 다음과 같다. 

 #import "파일명" [속성리스트]

  속성은 여러 속성을 지정할 수 있다. 속성에 대한 자세한 설명은 MSDN :  http://msdn.microsoft.com/ko-kr/library/298h7faa.aspx << 이 링크를 참조

 

 

6.4 C++언어확장

  6.4.1 __declspec(uuid())와 __uuidof()

    1) __declspec(uuid()) : COM객체나 interface에 GUID를 지정할 때 사용한다. 즉, 설정하는 쪽.

    2) __uuidof(표현식) : __declspec(uuid())에서 지정한 이름에서 GUID를 얻어온다. 즉, 사용하는쪽.

 

  6.4.2 __declspec(property)

    다음과 같이 속성을 지정했다고 가정.

 __declspec(property(get=Getname,put=Putname))

 _bstr_t name;

    이렇게 정의되면, 인터페이스의 멤버 name이 rvalue로 쓰일 경우.  

 wchar_t* myname;

 name = (wchar_t*)pIHello->name;    -> myname = (wchar_t*)pIHello->GetName();

 pIHello->name = myname;               -> pIHello->Putname(myname);

    위와 같이 해석해준다.

 

6.5 COM지원 클래스

  6.5.1 _com_ptr_t 스마트포인터 클래스

    "comip.h"에 com_ptr_t 템플릿 클래스가 구현되어 있다. 이 포인터 클래스는  _COM_SMARTPTR_TYPEDEF매크로에 의해 정의된다. 

 _COM_SMARTPTR_TYPEDEF(IHello, __uuidof(IHello));    //이 구문은

 typedef _com_ptr_t<_Com_IID<IHello, __uuidof(IHello)> > IHelloPtr; //이렇게 확장됨

    _com_ptr_t의 멤버함수 접근시에는 '.'연산자를, 생성된 COM객체의 멤버나 속성을 접근시 '->'연산자 사용.

 

  6.5.2 _com_error 클래스

     에러 발생시 생성되어 던져지는 객체. 강제 발생을 위해서는 _com_issue_error함수를 사용한다.

 

6.6 COM지원 전역함수

  ConvertStringToBSTR() : string -> BSTR변환

  ConvertBSTRToString() : BSTR -> String변환

반응형

댓글