__declspec(uuid()) , __uuidof() 와 __declspec(property)
__declspec(uuid()) 와 __uuidof()
__declspec의 uuid 확장 속성을 사용하여 다음과 같이 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