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

VC++ COM 程式設計必備核心理論知識全攻略

     編輯:VC 教學

一、為何需要 COM?

軟體工程演進目標始終是「積木式組裝」而非「逐行編寫」:

  • 結構化程式設計: 函式區塊,模組化,高內聚低耦合,但關注點在「功能」而非「事物」。
  • 物件導向(OOP): 關注穩定的「事物」(屬性+行為),以不變應萬變。但類別庫重用侷限於原始碼層級:語言綁定、需重新編譯、版本更新風險高。
  • DLL 二進位重用: 解決編譯依賴,但有四大缺陷:函式重名、C++ 名稱修飾不相容、路徑依賴、EXE/DLL 緊耦合(地址變更需重新連結)。

COM = 二進位重用 + 協定標準化,完美解決上述問題:

  • 無重名問題:透過虛函數表(vtable)而非名稱呼叫。
  • 無修飾問題:二進位相容跨語言。
  • 無路徑問題:登錄表定位,支援遠端元件(DCOM)。
  • 鬆散耦合:介面不變,實作可隨時替換,EXE 無感知。

二、VC++ COM 開發必掌握的 5 大核心概念

1. 元件 = C++ 類別,介面 = 純虛擬類別

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 物件繼承介面,實作介面方法。用戶端僅持有介面指標。

2. IUnknown:所有介面的基石

  • QueryInterface:導航介面之間(動態查詢能力)。
  • AddRef/Release:參考計數管理生命週期。

3. 類別工廠與註冊表

  • IClassFactory::CreateInstance:建立元件實例。
  • 註冊表 HKCR\CLSID\{...}\InprocServer32 記錄 DLL 路徑,ThreadingModel 指定公寓類型。

4. 介面識別符(IID)與類別識別符(CLSID)

全域唯一識別碼(GUID),由 guidgen.exe 產生,確保全球不衝突。

5. 記憶體管理規則

  • [out] 參數由被呼叫者配置,呼叫者釋放(CoTaskMemFree)。
  • BSTR 字串用 SysAllocString/SysFreeString。
  • 介面指標傳遞前需 AddRef,用畢 Release。

三、VC++ 實作兩大路徑

ATL (Active Template Library)MFC
輕量、高效、標準 COM 支援完整整合文件/視圖架構、Wizard 支援強
適合純 COM 元件、控制項適合 MFC 應用程式內嵌 COM
手寫程式碼較多Wizard 產生樣板碼

四、避坑指南

  1. 介面不可變: 已發布介面絕不修改,新功能新增介面(IMyInterface2)。
  2. 參考計數嚴謹: 循環參考導致洩漏,慎用智慧指標(CComPtr、_com_ptr_t)。
  3. 執行緒模型正確: 註冊表 ThreadingModel 與實際實作一致(Free/Both/Apartment)。
  4. 錯誤處理: 所有方法回傳 HRESULT,用 FAILED/SUCCEEDED 宏判斷。
  5. 單元測試: 獨立測試元件,再整合至容器。

五、學習路徑建議

  1. 閱讀《COM 技術內幕》建立理論基礎。
  2. 從 ATL 簡單專案入手,理解 CComObjectRoot、CComCoClass、COM_MAP 運作。
  3. 實作雙重介面、連接點、聚合等進階特性。
  4. 研究註冊表結構、類別工廠、封送處理內部機制。
  5. 嘗試 DCOM 遠端部署、安全性設定。

總結

COM 雖然機制繁複,但核心思想簡潔:「二進位標準化的介面契約」。掌握上述 5 大核心概念、記憶體規則與開發路徑,配合 ATL/MFC 框架,即可高效開發健壯的 COM 元件。切記:介面設計是成敗關鍵,投入足夠時間規劃介面層次與版本演進策略。

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