Active Template Library (ATL) 是開發高效能、輕量級 COM 元件的最佳選擇。本文以循序漸進的方式,引導初學者完成從 ATL 專案建立、COM 物件新增、方法實作、編譯註冊,到 Visual Basic 6.0 與 Visual C++ 控制台應用程式雙重測試的完整流程。
Simple_ATL,路徑:E:\samples\Simple_ATL
Simple_ATL Classes → New ATL ObjectFirst_ATL(其餘自動填入)
IFirst_ATL 介面節點IFirst_ATL → Add MethodHRESULT(預設,不可變)AddNumbers[in] long Num1, [in] long Num2, [out] long *ReturnVal
[in]:輸入參數(封送為 by value)[out]:輸出參數(封送為 by reference,需指標)long*:輸出參數必須為指標型別AddNumbers 節點編輯實作碼
STDMETHODIMP CFirst_ATL::AddNumbers(long Num1, long Num2, long *ReturnVal)
{
// TODO: Add your implementation code here
*ReturnVal = Num1 + Num2;
return S_OK;
}
DllRegisterServer 完成註冊Command1)
Private Sub Command1_Click()
Dim objTestATL As SIMPLE_ATLLib.First_ATL
Set objTestATL = New First_ATL
Dim lngReturnValue As Long
objTestATL.AddNumbers 5, 7, lngReturnValue
MsgBox "The value of 5 + 7 is: " & lngReturnValue
Set objTestATL = Nothing
End Sub
Test_ATLTest_ATL.cpp
// Test_ATL.cpp
#include
using namespace std;
// 1. 包含 ATL 產生的標頭檔(需調整路徑)
#include "..\Simple_ATL\Simple_ATL.h"
// 2. 從 Simple_ATL_i.c 複製 GUID 定義(或直接 #include "..\Simple_ATL\Simple_ATL_i.c")
const IID IID_IFirst_ATL =
{0xC8F6E230,0x2672,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};
const CLSID CLSID_First_ATL =
{0x970599E0,0x2673,0x11D3,{0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};
void main(void)
{
// 3. 宣告介面指標
HRESULT hr;
IFirst_ATL *pIFirstATL = NULL;
// 4. 初始化 COM 程式庫
hr = CoInitialize(NULL);
if (FAILED(hr)) return;
// 5. 建立 COM 物件實例
hr = CoCreateInstance(
CLSID_First_ATL,
NULL,
CLSCTX_INPROC_SERVER,
IID_IFirst_ATL,
(void**)&pIFirstATL
);
if (SUCCEEDED(hr) && pIFirstATL)
{
// 6. 呼叫方法(早期綁定,vtable 直接呼叫)
long ReturnValue;
pIFirstATL->AddNumbers(5, 7, &ReturnValue);
cout << "The answer for 5 + 7 is: " << ReturnValue << endl;
// 7. 釋放介面
pIFirstATL->Release();
}
else
{
cout << "CoCreateInstance Failed." << endl;
}
// 8. 反初始化 COM
CoUninitialize();
}
| 概念 | 說明 | 本例對應 |
|---|---|---|
| Dual Interface | 同時支援 vtable (早期綁定) 與 IDispatch (晚期綁定) | VB 使用晚期綁定,VC 使用早期綁定 |
| Apartment Model | 單執行緒單元,COM 自動處理同步 | 適合 UI 物件,VB 相容性佳 |
| IDL 定義 | 介面定義語言,編譯產生 .h/.tlb/_i.c | AddMethod 精靈自動維護 IDL |
| HRESULT 回傳 | COM 標準錯誤碼,S_OK=成功 | 實作中返回 S_OK |
| [out] long* | 輸出參數需用指標,呼叫端傳址 | ReturnVal 為 long* |
Simple_ATL_i.c 或 GUID 定義regsvr32 Simple_ATL.dll&ReturnValueATL 將繁複的 COM 基礎建設(IUnknown、IClassFactory、註冊表操作、封送處理)封裝為精靈驅動的標準化流程。本文示範的 Simple_ATL 專案從建立到雙客戶端驗證,完整展示了 ATL 開發 COM 進程內伺服器的標準路徑。掌握此流程,即可快速構建高效能、語言中立的可復用元件。