ActiveX 控制項 (OCX) 是 COM 物件,實作 IOleObject、IOleControl 等介面,需由容器 提供站點、管理生命週期、轉發訊息。開發階段使用 ActiveX Control Test Container (TSTCON) 進行除錯。
TSTCON32.EXE (VC6) 或 TestContainer.exe (VS2008+)。TRACE 宏,輸出至 VC **Output 視窗**。.h/.cpp 包裝類 (繼承 CWnd),含所有方法/屬性/事件的成員函數。
4. 對話框編輯器 **工具箱** 自動出現控制項圖示,拖放即可使用。
DoDataExchange 含 DDX_Control 關聯。
// 包裝類為 CMyAxCtrl
CMyAxCtrl* pCtrl = new CMyAxCtrl;
CRect rect(10, 10, 310, 210);
// CreateControl 內部呼叫 COleControlContainer::CreateControl
if (pCtrl->CreateControl(CLSID_MyAxCtrl, WS_VISIBLE | WS_CHILD, rect, this, IDC_MYCTRL)) {
// 成功,可呼叫方法
pCtrl->SomeMethod(param);
}
else {
delete pCtrl; // 建立失敗需手動刪除
}
關鍵:動態建立需指定 CLSID (或 ProgID)、視窗樣式、矩形、父視窗、控制項 ID。包裝類建構函數不建立視窗,必須呼叫 CreateControl。
CLASSID:控制項 GUID。CODEBASE:.CAB 封裝下載路徑 (含版本),IE 自動下載安裝未註冊控制項。PARAM:初始化屬性。| 問題 | 原因 | 解決 |
|---|---|---|
| 容器無法插入控制項 | 控制項未註冊、CLSID 錯誤、位元數不匹配 (x64 容器載入 x86 OCX) | regsvr32 MyCtrl.ocx,確認目標平台一致 |
| Invoke Method 參數型別錯誤 | 傳入 VARIANT 型別不符 (如 BSTR vs LONG) | 查看包裝類生成的函數原型,嚴格對應 |
| 事件不觸發 | 事件映射表 EVENT_MAP 缺漏、連接點未建議 | ClassWizard 添加事件、檢查 FireEvent 呼叫 |
| 授權失敗 (License) | 控制項需授權檔 (.lic),容器無授權資訊 | 開發機安裝授權、或使用 LPK 工具產生 .lpk 檔供網頁使用 |
| 動態建立 CreateControl 失敗 | 父視窗未初始化 OLE、未呼叫 AfxOleInit | CWinApp::InitInstance 呼叫 AfxOleInit() |
ActiveX 控制項開發流程:**編譯 → 測試容器載入 → Invoke Methods 驗證介面 → 事件日誌追蹤 → 專案整合產生包裝類 → 對話框/動態建立/網頁部署**。掌握測試容器操作、包裝類生成機制、動態建立 API、授權模型、跨平台位元數匹配,能讓您高效完成從開發到部署的完整閉環。