軟體工程演進目標始終是「積木式組裝」而非「逐行編寫」:
COM = 二進位重用 + 協定標準化,完美解決上述問題:
class IUnknown {
public:
virtual HRESULT QueryInterface(REFIID, void**) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
};
class IMyInterface : public IUnknown {
public:
virtual HRESULT DoSomething(int param) = 0;
};
class CMyComponent : public IMyInterface {
// 實作所有純虛擬函數
};
COM 物件繼承介面,實作介面方法。用戶端僅持有介面指標。
QueryInterface:導航介面之間(動態查詢能力)。AddRef/Release:參考計數管理生命週期。IClassFactory::CreateInstance:建立元件實例。HKCR\CLSID\{...}\InprocServer32 記錄 DLL 路徑,ThreadingModel 指定公寓類型。全域唯一識別碼(GUID),由 guidgen.exe 產生,確保全球不衝突。
[out] 參數由被呼叫者配置,呼叫者釋放(CoTaskMemFree)。BSTR 字串用 SysAllocString/SysFreeString。AddRef,用畢 Release。| ATL (Active Template Library) | MFC |
|---|---|
| 輕量、高效、標準 COM 支援完整 | 整合文件/視圖架構、Wizard 支援強 |
| 適合純 COM 元件、控制項 | 適合 MFC 應用程式內嵌 COM |
| 手寫程式碼較多 | Wizard 產生樣板碼 |
IMyInterface2)。CComPtr、_com_ptr_t)。ThreadingModel 與實際實作一致(Free/Both/Apartment)。HRESULT,用 FAILED/SUCCEEDED 宏判斷。CComObjectRoot、CComCoClass、COM_MAP 運作。COM 雖然機制繁複,但核心思想簡潔:「二進位標準化的介面契約」。掌握上述 5 大核心概念、記憶體規則與開發路徑,配合 ATL/MFC 框架,即可高效開發健壯的 COM 元件。切記:介面設計是成敗關鍵,投入足夠時間規劃介面層次與版本演進策略。