COM組件開發實踐(六)---From C++ to COM :Part 3

來源:互聯網
上載者:User

在上一篇文章《COM組件開發實踐(五)---From C++ to COM :Part 2 》中,我們進展到使用COM庫載入C++對象了,這一篇中我們將真正將C++對象變成 COM對象,而在下一篇中我們將為它添加多介面支援。

C++對象變成COM對象

要將一個C++對象變成一個真正的COM對象,只需要如下操作:

1)實現介面的引用計數。因此每個COM對象都需要有兩個函數用於管理引用計數:

ULONG AddRef();
  
ULONG Release();

這兩個函數不返回HRESULT,因為它們不可能失敗,除非對象已經不存在,而且它們也不需要傳回值,因為它們只是簡單地加減引用計數。

2)對象允許實現多個介面。假如對象要為不同的客戶返回不同的介面,則需要客戶告訴對象它需要哪個介面。實際上前面已經運用了一種方法:DllGetClassObject函數的IID參數。如果對象有多個介面,則類工廠對象的CreateDB函數(也就是真正建立對象的函數)應該增加一個參數:介面ID,即IID。

假如我們的DB對象有多個介面,一個介面用於建表,一個用於讀寫,一個用於獲得資料庫資訊。我們可以讓DB對象提供一個介面查詢函數,

HRESULT QueryInterface(RIID riid,void** ppObj);

3)類工廠對象使用標準的IClassFactory介面。4)使用_stdcall呼叫慣例。

5)實現DLL動態卸載。DLL的卸載由COM負責,COM查詢DLL看是否還在使用,它會調用DLL的引出函數DllCanUnloadNow來判斷是否可以卸載DLL.如果客戶程式想讓COM卸載所有未使用的庫,它會調用CoFreeUnusedLibraries函數。

6)實現對象自動註冊。只需要DLL實現兩個引出函數DllRegisterServer和DllUnregisterServer

1,修改介面檔案

1)將IDB由IUnknown派生,刪除Release成員函式宣告,為IDB所有成員函數添加_stdcall(因為COM對象在win32下採用標準呼叫慣例)。2)刪除類工廠IDBSrvFactory聲明,因為我們現在要使用標準類工廠介面IClassFactory,同時也刪除IID_IDBSrvFactory的聲明。3)聲明外部變數IID_IDB,

typedef long HRESULT;
#define DEF_EXPORT __declspec(dllexport)
// {30DF3430-0266-11cf-BAA6-00AA003E0EED}
extern const GUID CLSID_DBSAMPLE;
//{ 0x30df3430, 0x266, 0x11cf, { 0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed } };
// {30DF3432-0266-11cf-BAA6-00AA003E0EED}
extern const GUID IID_IDB;
//{ 0x30df3432, 0x266, 0x11cf, { 0xba, 0xa6, 0x0, 0xaa, 0x0, 0x3e, 0xe, 0xed } };
class IDB : public IUnknown
{
 // Interfaces
 public:
     // Interface for data access
    virtual HRESULT _stdcall Read(short nTable, short nRow, LPWSTR lpszData) =0;
    virtual HRESULT _stdcall Write(short nTable, short nRow, LPCWSTR lpszData) =0;
    // Interface for database management
    virtual HRESULT _stdcall Create(short &nTable, LPCWSTR lpszName) =0;
    virtual HRESULT _stdcall Delete(short nTable) =0;
    // Interfase para obtenber informacion sobre la base de datos
    virtual HRESULT _stdcall GetNumTables(short &nNumTables) =0;
    virtual HRESULT _stdcall GetTableName(short nTable, LPWSTR lpszName) =0;
    virtual HRESULT _stdcall GetNumRows(short nTable, short &nRows) =0;
    //virtual ULONG Release() =0;
};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.