首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

自動化基礎概念(一):COM 組件與介面的二進位契約

     編輯:關於C++

啟動 WINX 自動化支援介紹系列,首篇解析 COM 核心概念:組件與介面。

COM 組件 ≠ 類別

  • C 語言無類別也能實現 COM 組件。
  • 一個組件可能由多個類別實現,但客戶端只視為單一實體,不關心內部實現細節(嵌套類別、聚合等技術對客戶透明)。

本質上,COM 組件是基於二進位物件協定的「類別」。對外暴露的不是方法集合,而是介面集合。

介面:二進位層面的契約

一般意義上介面是「類別規格/契約」。COM 層面:符合 vtbl 機制的二進位協定,前三項必須與 IUnknown 相容(可理解為繼承 IUnknown)。

C++ 風格定義:

interface IFoo : IUnknown {
    virtual void __stdcall fooA() = 0;
    virtual int __stdcall fooB(int arg1, int arg2) = 0;
};

純 C 風格(手工 vtbl)同樣合法:

struct IFooVtbl {
    HRESULT (__stdcall *QueryInterface)(void* pThis, const GUID* iid, void** ppv);
    ULONG   (__stdcall *AddRef)(void* pThis);
    ULONG   (__stdcall *Release)(void* pThis);
    void    (__stdcall *fooA)(void* pThis);
    int     (__stdcall *fooB)(void* pThis, int arg1, int arg2);
};
struct IFoo { struct IFooVtbl* vptr; };

QueryInterface:版本演進的核心

  • 每個介面對應唯一 GUID,發布後不可修改,保證舊客戶相容。
  • 升級組件時,定義新介面繼承舊介面:interface IFoo2 : IFoo { virtual HRESULT __stdcall newFoo() = 0; };
  • 客戶端透過 QueryInterface 動態查詢新介面:
IFoo* pFoo; // 已有舊介面
IFoo2* pFoo2;
HRESULT hr = pFoo->QueryInterface(IID_IFoo2, (void**)&pFoo2);
if (SUCCEEDED(hr)) {
    // 使用 pFoo2 新功能
    pFoo2->Release();
}

IUnknown 三大核心

  • QueryInterface:介面導航,支援版本演進。
  • AddRef / Release:參考計數管理物件生命週期(詳見《C++ 記憶體管理變革》)。

這套二進位契約讓跨語言、跨模組、跨網路的元件互操作成為可能,是 COM 乃至自動化技術的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved