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

COM 原理與應用:COM 實作機制與註冊表管理

     編輯:關於C++

COM 實作與平台關係

COM 規範為平台無關模型;Windows 上的 COM 庫是具體實作,大量使用註冊表、DLL、LPC/RPC 等 Windows 特性。

元件類型

  • 進程內元件:DLL,載入客戶端進程空間。
  • 進程外元件:EXE,獨立進程,跨進程通訊。

DLL 建立要點

  • 使用 __stdcall 呼叫慣例 + extern "C" 導出,確保跨編譯器/語言相容。
  • 可用 .def 檔列出導出函數序號,或 __declspec(dllexport)。
  • 客戶端操作 DLL 三大 API:LoadLibrary、GetProcAddress、FreeLibrary。
  • 進程內元件可導出全域變數(同一位址空間)。

進程外元件通訊架構

客戶端進程                    元件進程
+------------------+         +------------------+
|  客戶代碼        |         |  元件物件        |
|  呼叫介面方法    |         |  實作介面方法    |
+--------+---------+         +--------+---------+
         |                            ^
         v                            |
+--------+---------+         +--------+---------+
|  代理器 代理器   |  LPC/RPC |  存根 存根       |
|  (Proxy DLL)     | ◄──────► |  (Stub DLL)      |
|  封送參數        |         |  解封參數        |
+------------------+         +------------------+
  • 跨進程通訊採用 LPC (本地) / RPC (遠端)。
  • 代理器/存根負責封送/解封 參數與回傳值。
  • 客戶端感覺像直接呼叫(虛線箭頭),實現進程透明性。

註冊表管理 COM 元件

COM 庫透過註冊表資訊建立物件。關鍵結構:

元件註冊操作

  • 進程內元件:regsvr32.exe DllName.dll,需導出 DllRegisterServer/DllUnregisterServer。
  • 進程外元件:可自行註冊(執行時帶參數 /RegServer)。

類別工廠

  • COM 物件的「生產基地」,每個 COM 類別對應一個類別工廠。
  • 實作 IClassFactory:CreateInstance (建立物件)、LockServer (控制元件壽命)。
  • 本身也是 COM 物件,由 DllGetClassObject (DLL) 或 CoRegisterClassObject (EXE) 建立/註冊。

COM 庫與類別工廠交互

路徑內容
HKCR\CLSID\{...}元件類別資訊
InprocServer32DLL 完整路徑 (進程內元件)
LocalServer32EXE 完整路徑 (進程外元件)
ProgID程式識別符 (字串名稱),API CLSIDFromProgID/ProgIDFromCLSID 轉換
Interface\{...}介面設定 (Proxy/Stub CLSID、ProxyStubClsid32)
TypeLib\{...}型別庫資訊
Component Categories元件分類 (CATID),同介面群組歸類

類別工廠控制元件壽命

  • LockServer(TRUE):鎖定計數 +1,防止元件卸載。
  • LockServer(FALSE):解鎖,計數歸零且無物件時允許卸載。

COM 庫核心職責

  • 物件建立協調 (SCM)。
  • 記憶體管理統一:IMalloc / CoTaskMemAlloc/Free/Realloc;支援自訂分配器;跨進程共享分配器 (OLE 提供)。
  • 元件載入/卸載控制:DLL 卸載條件 (物件數=0 且鎖計數=0) → CoFreeUnusedLibraries;EXE 退出主函數。
  • 常用介面定義:IUnknown、IClassFactory、IMalloc。

HRESULT 錯誤碼規範

  • 32 位整數:嚴重性(1) + 保留(1) + 設施碼(11) + 代碼(16) / 或分四域:類別(2)、自訂旗標(1)、操作碼(13)、結果碼(16)。
  • 標準宏:S_OK、E_FAIL、E_NOINTERFACE、E_OUTOFMEMORY... 定義於 WinError.h。
  • FormatMessage 可轉換為說明字串。

總結

COM 實作三方協作:客戶端程式、COM 庫、元件程式。註冊表為元件發現中樞;類別工廠為物件建立核心;代理器/存根+LPC/RPC 實現進程透明;COM 庫統一記憶體管理、元件生命週期與基礎設施。HRESULT 提供標準化錯誤報告機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
API用途流程
CoGetClassObject取得類別工廠介面DLL: 呼叫 DllGetClassObject;EXE: 啟動進程等待其註冊工廠
CoCreateInstance直接建立物件 (最常用)內部呼叫 CoGetClassObject → IClassFactory::CreateInstance
CoCreateInstanceEx建立遠端物件或一次取多介面支援 COSERVERINFO、MULTI_QI