3. Implementation/COM & ActiveX

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

SSKK 2008. 10. 9. 23:09

__declspec(uuid()) __uuidof()

 

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

 

struct __declspec(uuid(“5D5350AE-F8DF-41f1-9395-F9388C402E28”))

/* LIBID */ __HelloServerLib;

struct __declspec(uuid(“71F20FB8-0594-47c7-A99A-3200E110642D”))

/* CLSID */ Hello;

strcut __declspec(uuid(“38EA6580-0C0D-4f14-AC85-E3CBE5103CFB”))

/* interface */ IHello;

 

이와 같이 __declspec(uuid())를 사용하여 지정된 GUID 값을 꺼내오기 위해 __uuidof를 사용할 수 있다.

 

__uuidof(IHello)

 

__declspec(property)

 

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

 

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

_bstr_t name;

 

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

 

따라서, 다음과 같이 name 데이터 멤버에서 값을 읽는 코드가 작성될 때,

 

wchar_t * name;

name = (wchar_t*)pIHello->name

 

Visual C++ 컴파일러는 다음과 같이 get 함수로 지정된 Getname 함수를 호출한다.

 

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

 
참고 : 전병선의 Component Development with Visual C++ & ATL