COM编程个人学习总结

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、

你可能感兴趣的:(COM编程个人学习总结)