1、COM组件的3个函数,QueryInterface()、AddRef()、Release(),它们组成一个接口,叫"IUnknown"接口。任何接口,其实都包含了 IUnknown 接口。且在任何接口上,调用虚函数表中的第一个函数,其实就是调用 QueryInterface()函数,就得到你想要的另外一个接口指针。这个性质叫“接口的传递性”
HRESULT QueryInterface( REFIID iid, void** ppvObject ) :通过此函数来查询某个组件是否支持某个特定的接口,其中iid是传入的已知接口ID,若支持QueryInterface将返回一个指向这些接口的指针,不支持返回值将是一个失败结果。
2、接口声明的独立性:COM不提供类似C/C++的声明头文件,而是提供一个叫类型库(TLB)的声明。每个语言的IDE环境自己去根据TLB生成自己语言需要的包装。
3、判断调用COM函数成功与否的标准步骤: <COM中一般的函数返回值都是HRESULT型>
HRESULT hr = 调用组件函数;
if( SUCCEEDED( hr ) ){...} // 如果成功
......
if( FAILED( hr ) ){...} // 如果失败
4、COM中的字符串类型:COM为了支持分布式系统,其字符串类型的内存格式与普通字符串类型不同,而是使用了BSTR这种结构<basic里的str>。它首先是用来UNICODE的UTF16基本格式,然后在字符串的开头使用4个字节的固定空间表示字符串长度,字符串的末尾使用两个NULL字节表示字符串结束。C/C++中有一系列的这两种字符串的转换函数,在我转载的BLOG中有详细讲。
5、VARIANT数据类型,这种数据类型具有“跨语言的特性”,同时他可以存储任意类型的数据。从C语言的角度来讲,VARIANT 其实是一个结构,结构中用一个域(vt)表示------该变量到底表示的是什么类型数据,同时真正的数据则存贮在 union 空间中。
6、基本原则:
1、启动组件得到一个接口指针(Interface)后,不要调用AddRef()。因为系统知道你得到了一个指针,所以它已经帮你调用了AddRef()函数;
2、通过QueryInterface()得到另一个接口指针后,不要调用AddRef()。因为......和上面的道理一样;
3、当你把接口指针赋值给(保存到)另一个变量中的时候,请调用AddRef();
4、当不需要再使用接口指针的时候,务必执行Release()释放;
5、当使用智能指针的时候,可以省略指针的维护工作;
7、