本文提供一個完全用C++實現的進程內(DLL)COM伺服器,不要ATL或MFC提供任何支援。用這種方式編寫COM對象可以讓你深入地洞察到COM處理同處理序伺服程式的方法以及COM是如何建立類工廠的。利用本文提供的這個簡單架構你可以實現很基本的COM組件,如外殼擴充(Shell Extensions)等。如果你在使用過程中發現了任何問題,請將它反饋到vckbase@public.hk.hi.cn。
以下是用本文所說的方式編寫自己的COM對象要經過的步驟:
第一步:寫一個標頭檔,這個標頭檔包含以下內容:
1、包含檔案comdef.h:#include 。
2、定義COM伺服器的GUID。
_declspec(selectany) GUID CLSID_Mine = { 0xdc186800,
0x657f,
0x11d4,
{0xb0, 0xb5, 0x0, 0x50, 0xba, 0xbf, 0xc9, 0x4}
};
3、給出介面的IID以及這個介面要實現的方法定義。到時用戶端會用到這個介面的IID和介面的方法。
interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904")) ImyInterface : public IUnknown
{
STDMETHOD(Square)(long *pVal)PURE;
STDMETHOD(Cube)(long *pVal)PURE;
};
用戶端使用此介面:
HRESULT hr;
ImyInterface *pmine=(0);
hr = CoCreateInstance(CLSID_Mine, // COM 伺服器的CLSID
NULL, //不支援彙總
CLSCTX_INPROC_SERVER, // 是個DLL
__uuidof(ImyInterface), // 介面的IID
(void**)&pmine
);
還有一種方法可以從註冊表中獲得COM對象的CLSID,就是調用CLSIDFromProgId()函數,不過必須把組件的ProgId傳遞給這個函數。
第二步:必須為所定義的介面提供實現,本文用的方法是建立一個從介面繼承的新類:
// 這個類實現單介面ImyInterface ...
//
//
class CmyInterface : public CComBase<> ,
public InterfaceImpl
{
public:
CmyInterface();
virtual ~CmyInterface();
// 我們必須要為QueryInterface 編寫代碼
STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv);
// ImyInterface 介面方法
STDMETHOD(Square)(long *pVal);
STDMETHOD(Cube)(long *pVal);
};
模版類InterfaceImpl<>提供介面引用計數的實現。在此我們可以用多介面繼承,那樣就能在一個COM組件中實現多個介面。