啟動 WINX 自動化支援介紹系列,首篇解析 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; };
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();
}
這套二進位契約讓跨語言、跨模組、跨網路的元件互操作成為可能,是 COM 乃至自動化技術的基石。