補一點COM的知識,有關_com_ptr_t

TLB文件是一個說明文件,通過TLB文件,用戶可以得知你的DLL文件中的COM接口
以及常量等的信息,這樣一來用戶才知道你的DLL中有什麼接口與常量等,用戶才
能用你的接口,當然了,如果你的COM接口只想自己使用,你可以不做TLB文件告訴
其他人這些信息了。

在使用#import引入一個com組件的時候,會自動生成.tlh和.tli兩個文件,這個兩個文件是對com類的封裝,tlh是標準頭文件,裏面爲每個組件類定義了一個_com_ptr_t類型的智能指針,tli裏面是代碼文件,裏面是對COM組件類的成員的封裝,具體可以自己import一個msado15.dll看一下。

TLB常常會包含以下這個功能:
智慧型指標宣告:樣板類別 _com_ptr_t 屬於一個智慧型指標,該類別封裝了介面指標並排除呼叫 AddRef, Release, QueryInterface 等繁瑣的步驟。另外也隱藏了 CoCreateInstance 建立一個新的 COM 物件的呼叫。這個部分使用 _COM_SMARTPTR_TYPEDEF 來產生特異化(Specialization)版本的 _com_ptr_t 類別。例如:
 _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
 編譯器會將上述的程式擴展成
 typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;

上面是在介紹.tlb包含的內容時說到的一點,會自想的時候動添加一個智能指針,以後創建COM對象的時候就可以不用CoCreateInstance了。
比如引入msado15.dll這個庫後,會在msado15.tlh文件中有這樣一句
_COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
這句會被編譯器擴展成
typedef _com_ptr_t<_com_IIID<_Connection,0x0> > _ConnectionPtr
然後就可以使用這個智能指針_ConnectionPtr了,創建COM對象時也只是

 

    _ConnectionPtr pMyConnect = NULL;
    HRESULT hr 
= pMyConnect.CreateInstance(__uuidof(Connection));

那個__uuidof(Connection)中的Connection是個結構體,實際上是這樣的

struct /* coclass */ Connection;

定義在msado15.tlh文件中。

其他的諸如_RecordsetPtr,_CommandPtr都一樣,都是com_ptr_t類型的。

 

原文:http://www.cnblogs.com/coderlee/archive/2008/02/18/1071755.html

發佈了7 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章