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

組件技術基石:COM 模型核心規範與程式設計指南

     編輯:關於C語言

背景:分布式軟件架構下,面向對象難以直接適配,組件化設計應運而生。OMG 推 CORBA,Microsoft 推 COM,分佔 UNIX/Windows 陣營。

COM 核心定義

  • 規範而非語言:定義組件二進制標準、交互協議、生命周期管理
  • 二進制兼容:組件以 DLL/EXE 發布,任何語言編寫,只要符合二進制佈局即可互操作
  • 接口編程:客戶通過接口指針訪問服務,實現細節完全封裝

COM 組件四大核心要求

  1. 動態鏈接:運行時加載,不靜態鏈接
  2. 實現封裝:接口不暴露內部語言、數據結構、算法細節
  3. 二進制發布:無源碼分發,保護知識產權
  4. 版本兼容:升級不破壞現有客戶 (向後兼容)
  5. 位置透明:本地/遠程調用統一接口 (DCOM 支持)

使用組件三大優勢

  1. 演化靈活:應用可漸進升級,組件獨立更新
  2. 快速構建:組件庫中取用,像搭積木組裝應用
  3. 分布式簡化:位置透明屏蔽網絡通信細節

COM 核心術語表

術語定義關鍵點
Interface純虛函數集合 (C++ 抽象基類)名稱以 I 開頭 (如 IUnknown)、不可變、引用計數管理
CoClass實現一組接口的具體類COM 對象 = CoClass 實例;非 C++ class 概念
COM Server包含 CoClass 的 DLL/EXEIn-proc (DLL) / Local (EXE) / Remote (DCOM)
Registration向註冊表登記 CLSID/路徑/線程模型regsvr32 註冊,反註冊移除
GUID / UUID128位全局唯一標識符接口用 IID,類用 CLSID,解決命名衝突
HRESULT32位錯誤/成功代碼SUCCEEDED/FAILED 宏判斷,錯誤查詢工具可用
IUnknown所有接口基礎QueryInterface/AddRef/Release 三大方法

IUnknown 三大核心方法

HRESULT QueryInterface(REFIID riid, void **ppv);  // 獲取其他接口指針
ULONG AddRef();                                    // 增加引用計數
ULONG Release();                                   // 減少引用計數,歸零自銷毀

規則:獲取接口必須 AddRef,用畢必須 Release,否則洩漏或過早銷毀。


COM 程式設計關鍵流程

  1. 初始化:CoInitialize/CoInitializeEx
  2. 創建對象:CoCreateInstance(CLSID, NULL, CLSCTX, IID, &ptr)
  3. 接口查詢:pUnk->QueryInterface(IID_Ixxx, (void**)&pXxx)
  4. 業務調用:通過接口指針調用方法
  5. 釋放資源:pXxx->Release(),最後 CoUninitialize()

註冊表關鍵項

HKEY_CLASSES_ROOT\CLSID\{CLSID}
  InprocServer32 = "path.dll"      // DLL 路徑
  ThreadingModel = "Apartment"     // 線程模型
  ProgID = "MyComponent.Class.1"   // 人類可讀名
HKEY_CLASSES_ROOT\Interface\{IID}
  ProxyStubClsid32 = "{...}"       // 遠程調用存根

總結

COM 以二進制標準 + 接口契約 + 引用計數構建語言無關的組件生態。核心價值:封裝實現細節、實現二進制復用、支撐分布式演化。雖然 .NET/WCF/WinRT 等新技術層出不窮,但 COM 仍是 Windows 系統級開發、Shell 擴展、Office 自動化、DirectX 等領域的基石。理解 COM 原理,有助於掌握現代組件架構的底層邏輯。

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