2009. 6. 12. 22:04

__declspec(uuid()), __uuidof(), __declspec(property)

__declspec(uuid()) 와 __uuidof()

Visual C++ 는 __declspec 의 uuid 확장 속성을 사용하여 다음과 같이 COM 객체나 인터페이스에 GUID 를 지정할 수 있게 한다.

 struct __declspec(uuid("4A6AAD5E-41C8-47a6-A5FA-53CBC8506424"))
/* LIBID */ __HelloServerLib;
struct __declspec(uuid("37DB7E59-075D-4c79-A9DC-1D25CADF647A"))
/* CLSID */ Hello;
struct __declspec(uuid("12188C03-A0B6-4c30-B8FE-8B9E39C6D495"))
/* interface */ IHello;


이와 같이 __declspec(uuid()) 를 사용하여 지정된 GUID 값을 꺼내오기 위해 __uuidof() 라는 예약어를 지원한다.

__uuidof(Hello)
__uuidof(IHello)


__declspec(property)

__declspec(property) 확장 속성은 클래스의  '비정적 가상 데이터 멤버(non-static virtual data member)'에 사용할 수 있다. 이 속성이 지정되고 이 변수에 포인터 멤버 선택 연산자('->')를 사용하여 참조할 때 컴파일러는 이들에 대하여 대응되는 함수 호출로 변경한다.

 __declspec(property(get=Getname, put=Putname) _bstr_t name;

위의 __declspec(property) 확장 속성은 포인터 멤버 선택 연산자('->')와 함께 name 식별자가
rvalue 로 사용될 때 get 함수로 지정된 Getname 함수를 호출하고,
lvalue로 사용될 때 put 함수로 지정된 Putname 함수를 호출하게 된다.

wchar * name;
name = (wchar *)pIHello->name;

Visual C++ 는 다음과 같이 호출한다.

 name = (wchar*)pIHello->Getname();

이러한 예는 MSXML2의 스마트 포인터를 사용할 때 자주 나온다. 아래는 그 코드

 MSXML2::IXMLDOMNodePtr spNode;
spNode->text = _T("Hello");
CString strText = (LPCTSTR) spNode->text;

참고 : Component Development with Visual C++ & ATL