首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

從零構建 ActiveX 控件:VC++ 開發與 C# 互操作完整圖解

     編輯:關於C++

ActiveX 控件作為 COM 技術的經典應用,雖已非主流,但在工業控制、老舊系統維護、瀏覽器插件等場景仍不可替代。本文以圖文並茂形式,完整演示從 VC++ 創建 ActiveX 控件項目、添加屬性/方法/事件、到 C# WinForms 專案引用測試的全流程。

一、 環境準備與項目創建

  1. 打開 Visual C++ (VS 2010/2013/2015/2019 均可),選擇 MFC ActiveX 控件向導。
  2. 項目名:ActiveXDemo,確定進入向導。
  3. 保持默認設置(單控件、無運行許可證),直接 完成。

向導自動生成核心類:CActiveXDemoCtrl (控件邏輯)、CActiveXDemoPropPage (屬性頁)、IDL 定義、註冊腳本等。

二、 編譯與容器測試

  1. 編譯:F7 生成 ActiveXDemo.ocx。
  2. 測試容器:VS 自帶 ActiveX 控件測試容器 (Ctrl+Shift+T 或工具欄圖標)。
  3. 菜單 Edit → Insert New Control,選擇 ActiveXDemo Control 插入。
  4. 控件顯示為白底橢圓,證明繪製邏輯生效。

三、 添加自定義屬性:OutStr

  1. 類視圖右鍵 CActiveXDemoCtrl → Add Property。
  2. 類型:BSTR (COM 字符串),名稱:OutStr,實現類型:Member Variable,變量名:m_strOutStr。
  3. 向導自動在 .h/.cpp 生成 Get/Set、DISP_PROPERTY、IDL propget/propput。
  4. 修改 OnDraw 繪製文本:
void CActiveXDemoCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) {
    pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    pdc->Ellipse(rcBounds);
    pdc->TextOut(10, 10, m_strOutStr); // 繪製屬性字符串
}

四、 VC++ 對話框專案測試控件

  1. 新建 MFC 對話框專案 TestContainer。
  2. 對話框編輯器右鍵 → Insert ActiveX Control → 選擇 ActiveXDemo Control。
  3. 屬性視圖設置 OutStr = "Hello from VC++"。
  4. 運行:對話框顯示橢圓及文本,屬性綁定成功。

五、 添加股票事件:DblClick

  1. 類視圖右鍵 CActiveXDemoCtrl → Add Event。
  2. 事件類型選 Stock,選中 DblClick,確定。
  3. 向導在 IDL 添加 [id(DISPID_DBLCLICK)],在 .cpp 添加 EVENT_STOCK_DBLCLICK() 映射。
  4. 測試容器雙擊控件,底部日誌顯示 DblClick 觸發。

六、 C# WinForms 專案互操作測試

  1. 新建 C# Windows Forms App (.NET Framework)。
  2. 工具箱右鍵 → Choose Items → COM Components 標籤 → 勾選 ActiveXDemo Control → 確定。
  3. 從工具箱拖放控件到 Form,命名 axActiveXDemo1。
  4. VS 自動生成 AxActiveXDemoLib.dll (RCW) 與 ActiveXDemoLib.dll (Interop)。
  5. 代碼測試:
public Form1() {
    InitializeComponent();
    axActiveXDemo1.OutStr = "ActiveX Demo from C#"; // 設置屬性
}

private void axActiveXDemo1_DblClick(object sender, EventArgs e) {
    MessageBox.Show("VC++ 編寫 ActiveX 控件,C# 測試成功!");
}
  1. 運行:Form 顯示控件文本,雙擊彈出消息框,跨語言互操作完美閉環。

七、 關鍵技術點總結

環節核心機制注意事項
IDL 定義接口契約,定義屬性/方法/事件 DISPID修改後需重新編譯 OCX 並重新註冊 (regsvr32)
屬性實現Member Variable 自動生成 Get/Set + 通知綁定複雜類型用 VARIANT/BSTR/SAFEARRAY
事件觸發Fire_Click() 等股票事件 / Fire_CustomEvent() 自定義事件連接點機制,容器實現 _IActiveXDemoEvents 接口
C# 互操作RCW (Runtime Callable Wrapper) 封裝 COM 指針引用計數由 CLR 管理,注意 Marshal.ReleaseComObject 釋放時機
部署目標機需註冊 OCX (regsvr32 ActiveXDemo.ocx)64 位系統註冊到 SysWOW64,C# 專案勾選 Prefer 32-bit 或編譯 x64 OCX

八、 常見坑與排查

  • 類未註冊 (CLASS_E_CLASSNOTAVAILABLE):以管理員權限執行 regsvr32,檢查 OCX 依賴 (Dependency Walker)。
  • C# 工具箱不顯示:確認 OCX 已註冊,重啟 VS,嘗試 Reset Toolbox。
  • 屬性不生效:檢查 IDL propget/propput 屬性標志,OnDraw 是否調用 InvalidateControl() 觸發重繪。
  • 事件不觸發:確認 EVENT_SINK_MAP 正確,容器是否實現了事件接口 (C# 自動生成)。

完整項目源碼下載:activexdemo.rar (含 VC++ 控件、VC++ 測試容器、C# 測試專案)。

掌握 ActiveX 開發流程,不僅能維護存量系統,更能深入理解 COM 雙介面、連接點、封送處理等 Windows 核心互操作機制,為學習 .NET Interop、WinRT、WebView2 等現代技術打下堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved