目標
建立一個 In-Process COM DLL(`Simple_ATL.dll`),包含介面 `IFirst_ATL` 與方法 `AddNumbers(long, long, long*)`,並分別用 VC++ 與 VB 6.0 調用。
步驟 1:建立 ATL COM 專案
- VC++ 選擇 ATL COM AppWizard,專案名 `Simple_ATL`。
- Server Type 選 Dynamic Link Library (DLL),其餘預設,Finish。
步驟 2:新增 ATL 簡單物件
- ClassView 右鍵 → New ATL Object → Simple Object。
- Short Name 輸入 `First_ATL`,Attributes 頁:Threading Model = Apartment,Interface = Dual,Aggregation = No。
步驟 3:新增方法
- ClassView 展開 `IFirst_ATL`,右鍵 → Add Method。
- Method Name:`AddNumbers`,Parameters:
[in] long Num1, [in] long Num2, [out] long *ReturnVal。
- 雙擊方法跳轉實作,填入:
*ReturnVal = Num1 + Num2; return S_OK;
步驟 4:編譯並註冊
Build 專案,輸出 `Simple_ATL.dll`。以管理員身分執行 regsvr32 Simple_ATL.dll 註冊。
VC++ 客戶端調用(智慧指標)
#import "Simple_ATL.tlb" no_namespace
CoInitialize(NULL);
ISimple_ATLPtr p(__uuidof(First_ATL));
long result;
p->AddNumbers(10, 20, &result); // result = 30
CoUninitialize();
VB 6.0 客戶端調用
Dim obj As New Simple_ATL.First_ATL
Dim result As Long
obj.AddNumbers 10, 20, result
MsgBox result ' 30
關鍵檔案說明
- `Simple_ATL.idl`:定義介面與類別,MIDL 編譯產生 `.tlb` 與 Proxy/Stub 代碼。
- `First_ATL.h/.cpp`:`CFirst_ATL` 實作 `IFirst_ATL`,繼承 `CComObjectRootEx`、`CComCoClass`、`IDispatchImpl`。
- `dlldata.c`、`Simple_ATL_i.c`:模組進入點與 GUID 定義。