COM 規範為平台無關模型;Windows 上的 COM 庫是具體實作,大量使用註冊表、DLL、LPC/RPC 等 Windows 特性。
__stdcall 呼叫慣例 + extern "C" 導出,確保跨編譯器/語言相容。.def 檔列出導出函數序號,或 __declspec(dllexport)。LoadLibrary、GetProcAddress、FreeLibrary。
客戶端進程 元件進程
+------------------+ +------------------+
| 客戶代碼 | | 元件物件 |
| 呼叫介面方法 | | 實作介面方法 |
+--------+---------+ +--------+---------+
| ^
v |
+--------+---------+ +--------+---------+
| 代理器 代理器 | LPC/RPC | 存根 存根 |
| (Proxy DLL) | ◄──────► | (Stub DLL) |
| 封送參數 | | 解封參數 |
+------------------+ +------------------+
COM 庫透過註冊表資訊建立物件。關鍵結構:
| 路徑 | 內容 | |
|---|---|---|
HKCR\CLSID\{...} | 元件類別資訊 | |
InprocServer32 | DLL 完整路徑 (進程內元件) | |
LocalServer32 | EXE 完整路徑 (進程外元件) | |
ProgID | 程式識別符 (字串名稱),API CLSIDFromProgID/ProgIDFromCLSID 轉換 | |
Interface\{...} | 介面設定 (Proxy/Stub CLSID、ProxyStubClsid32) | |
TypeLib\{...} | 型別庫資訊 | |
Component Categories | 元件分類 (CATID),同介面群組歸類 |
| API | 用途 | 流程 |
|---|---|---|
CoGetClassObject | 取得類別工廠介面 | DLL: 呼叫 DllGetClassObject;EXE: 啟動進程等待其註冊工廠 |
CoCreateInstance | 直接建立物件 (最常用) | 內部呼叫 CoGetClassObject → IClassFactory::CreateInstance |
CoCreateInstanceEx | 建立遠端物件或一次取多介面 | 支援 COSERVERINFO、MULTI_QI |