- class __declspec(uuid("B372C9F6-1959-4650-960D-73F20CD479BA")) Class;
- struct __declspec(uuid("B372C9F6-1959-4650-960D-73F20CD479BB")) Interface;
- void test()
- {
- CLSID clsid = __uuidof(Class);
- IID iid = __uuidof(Interface);
- ...
- }
這 比起你以前定義uuid的方法簡單多了吧?可惜,這樣好用的東西,它只在VC++中提供。不過沒有關係,我們這裏介紹一個技巧,可以讓你在幾乎所有C++ 編譯器中都可以這樣方便的使用__uuidof。這裏沒有說是所有,是因爲我們使用了模板特化技術,可能存在一些比較“古老”的C++編譯器,不支持該特 性。
也許你已經迫不及待了。好,讓我們來看看:
- #include <string>
- #include <cassert>
- inline
- STDMETHODIMP_(GUID) GUIDFromString(LPOLESTR lpsz)
- {
- HRESULT hr;
- GUID guid;
- if (lpsz[0] == '{')
- {
- hr = CLSIDFromString(lpsz, &guid);
- }
- else
- {
- std::basic_string<OLECHAR> strGuid;
- strGuid.append(1, '{');
- strGuid.append(lpsz);
- strGuid.append(1, '}');
- hr = CLSIDFromString((LPOLESTR)strGuid.c_str(), &guid);
- }
- assert(hr == S_OK);
- return guid;
- }
- template <class Class>
- struct _UuidTraits {
- };
- #define _DEFINE_UUID(Class, uuid) /
- template <> /
- struct _UuidTraits<Class> { /
- static const GUID& Guid() { /
- static GUID guid = GUIDFromString(L ## uuid); /
- return guid; /
- } /
- }
- #define __uuidof(Class) _UuidTraits<Class>::Guid()
- #define DEFINE_CLSID(Class, guid) /
- class Class; /
- _DEFINE_UUID(Class, guid)
- #define DEFINE_IID(Interface, iid) /
- struct Interface; /
- _DEFINE_UUID(Interface, iid)
這樣一來,就已經模擬出一個__uuidof關鍵字。我們可以很方便進行uuid的定義。舉例如下:
- DEFINE_CLSID(Class, "{B372C9F6-1959-4650-960D-73F20CD479BA}");
- DEFINE_IID(Interface, "{B372C9F6-1959-4650-960D-73F20CD479BB}");
- void test()
- {
- CLSID clsid = __uuidof(Class);
- IID iid = __uuidof(Interface);
- ...
- }
在VC++中,爲了與其他編譯器以相同的方式來進行uuid的定義,我們不直接使用__declspec(uuid),而是也定義DEFINE_CLSID, DEFINE_IID宏:
- #define DEFINE_CLSID(Class, clsid) /
- class __declspec(uuid(clsid)) Class
- #define DEFINE_IID(Interface, iid) /
- struct __declspec(uuid(iid)) Interface
這樣一來,我們已經在所有包含VC++在內的支持模板特化技術的編譯器中,提供了__uuidof關鍵字。通過它可以進一步簡化你在C++語言中實現COM組件的代價。