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변환
댓글