COM组件(组件对象模型)

com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准。com是一种标准,按照是com标准实现的dll可以被视为com组件。它采用的是虚拟函数表(VTBL)形式。虚拟函数表中包含了组件函数的一组指针,我们可以通过这组指针来获取我们想要通信的组件函数的内存地址。
COM组件的表现形式可以是dll也可以是exe。COM组件是二进制编码,在Windows和Linux下可以直接使用,不需要重新编译。

COM对象通过控制对某对象的引用次数来决定其生命周期, 若COM对象Release后, 引用计数减1, 但还不是0, 则该对象就不会被释放

1 COM特性

  • 语言无关
  • 进程透明
  • 可重用性
  • 多线程特性
  • 可扩展性

    2 COM接口

  • IID: GUID的一种用法, 128位整数, 是COM接口的标识, 例如: {54BF6567-1007-11D1-B0AA-444553540000}

  • 接口定义语言 COM IDL
  • 对应于C++中由纯虚函数组成的类
  • 单继承, 基类名: IUnknown, 所有的COM接口都从IUnknown派生 ```cpp class IUnknown { public: virtual HRESULTstdcall QueryInterface(const IID& iid, void **ppv) = 0 ; virtual ULONG stdcall AddRef() = 0; virtual ULONG __stdcall Release() = 0; };

class IDictionary : public IUnknown {
virtual BOOL Initialize() = 0; virtual BOOL LoadLibrary(String) = 0; virtual BOOL InsertWord(String, String) = 0; virtual void DeleteWord(String) = 0; virtual BOOL LookupWord(String, String *) = 0; virtual BOOL RestoreLibrary(String) = 0; virtual void FreeLibrary() = 0; }; ``` image.png

3 COM对象

image.png

  • CLSID: GUID的一种用法, 是COM对象的标识, 创建对象时必须要提供CLSID, 它有两种形式
    • 128位整数,随机数,不需要运算功能,但是需要比较和查找功能
    • 字符串形式, 例如: {72d3edc2-a4c4-11d0-8533-00c04fd8d503}
  • ProgID: 只有字符串形式, 如”dm.dmsoft”, “TURING.FISR”
    • 有可能重名, 用一种约定来避免重名, 如”lw.lwsoft3”与”lw.lwsoft3.1”