COM(Component Object Model,元件物件模型)是微軟推動的二進制程式設計規範,實現跨語言、跨進程、跨機器的元件互操作。本文以 C++ Builder 4.0 為開發工具,詳細演示 COM 服務端與客戶端的完整建立流程,包含介面定義、類型庫編輯、註冊部署與多種呼叫方式。
File → New → ActiveX → ActiveX Library,儲存為 PCOMServer。IDE 自動生成專案檔、DLL 入口點代碼、ATL 支援檔案。
Use dynamic RTLBuild with runtime packages使 DLL 不依賴 VCL 運行時庫,利於獨立部署。
File → New → ActiveX → Automation Object,類別命名為 MyCOM。自動進入類型庫編輯器,生成介面 IMyCOM。
在類型庫編輯器中新增方法 AddInt:
x、y(輸入整數)、ret(輸出指標)[id(0x00000001)] HRESULT _stdcall AddInt([in] int x, [in] int y, [out, retval] int * ret);編輯 MyCOMImpl.cpp:
STDMETHODIMP TMyCOMImpl::AddInt(int x, int y, int* ret) {
*ret = x + y;
return S_OK;
}
Project → Build PCOMServer 生成 DLLRegister 完成註冊HKEY_CLASSES_ROOT\PCOMServer.MyCOM\CLSID 記錄 GUID將 PCOMServer_TLB.cpp/h 加入專案,或用 Project → Import Type Library 重新生成。
| 類別 | 呼叫方式 | 特點 |
|---|---|---|
IMyCOM | IDispatch | 支援無虛擬函數表語言(如 VB),速度較慢 |
TCOMIMyCOMT | 智慧介面(VTable) | 雙重支援 IDispatch/VTable,效能最佳 |
IMyCOMDispT | Disp 介面 | 優化 IDispatch 速度,仍慢於 VTable |
CoMyCOM | 類別建立器 | 自動建立代理實例 |
智慧介面(VTable)呼叫:
int x = 6, y = 6;
TCOMIMyCOM Obj;
Obj = CoMyCOM::Create();
Obj->AddInt(x, y, &y); // VTable 直接呼叫
Edit1->Text = IntToStr(y);
Disp 介面呼叫:
int x = 6, y = 6;
IMyCOMDisp App;
App.BindDefault();
App.AddInt(x, y, &y); // Disp 介面呼叫
Edit1->Text = IntToStr(y);
COM 非程式語言,而是程式設計規範與方法論。C++ Builder 以視覺化方式封裝 ATL 細節,大幅降低開發門檻。掌握 COM 技術是理解 Windows 系統架構、實現軟體「即插即用」的關鍵路徑。進階學習建議參考《COM 技術內幕》(清華大學出版社)。