用純粹的C++編寫COM組件

來源:互聯網
上載者:User

本文提供一個完全用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組件中實現多個介面。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.