李超

cc编程笔记本。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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类型的。

posted on 2008-02-18 08:15  coderlee  阅读(3264)  评论(2编辑  收藏  举报