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

跨語言 COM 互操作:VC 6.0 呼叫 Delphi 開發的進程內 COM 元件

     編輯:關於VC++

COM 的二進制相容性承諾使得不同語言開發的元件能無縫互操作。本文實戰記錄如何在 VC 6.0 專案中呼叫 Delphi 5.0 開發的進程內 COM 伺服器,核心在於 IDL 檔案的轉換與介面定義的正確對應。

核心挑戰:IDL 檔案的跨編譯器相容

Delphi 產生的 .idl 檔案需經 MIDL 編譯器產生 VC 可用的 .h 與 _i.c 檔案。作者分享了繞過 MIDL 直接操作的實用技巧:

  1. 在 VC 建立空白 ATL 專案(如 ttt)
  2. 編譯一次產生 ttt.idl、ttt.h、ttt_i.c
  3. 以 Delphi 產生的 madll.idl 覆寫 ttt.idl
  4. 重新編譯專案,獲得對應的 madll.h、madll_i.c

Delphi 端 COM 伺服器建立

Delphi 5.0 建立進程內 COM 伺服器步驟:

  1. File → New → ActiveX Library
  2. File → New → COM Object
  3. 定義介面 ImaCom 並加入方法 ShowMa
  4. 編譯產生 madll.dll 與 madll.idl
  5. 註冊:regsvr32 madll.dll

VC 6.0 客戶端呼叫實作


// 專案設定:加入 madll.h 路徑至 Additional Include Directories
#include "madll.h"  // 包含介面定義與 CLSID/IID

void CMacppDlg::OnButton1()
{
    HRESULT hr;
    ImaCom* pmaCom = NULL;
    
    // 1. 初始化 COM 程式庫
    hr = CoInitialize(NULL);
    if (FAILED(hr)) return;
    
    // 2. 建立 COM 物件實例
    hr = CoCreateInstance(
        CLSID_maCom,           // 從 madll_i.c 取得
        NULL,
        CLSCTX_INPROC_SERVER,  // 進程內伺服器
        IID_ImaCom,            // 從 madll_i.c 取得
        (void**)&pmaCom
    );
    
    if (SUCCEEDED(hr) && pmaCom)
    {
        // 3. 呼叫 COM 方法
        // 參數:介面指標、視窗控制代碼(用於訊息框父視窗)
        pmaCom->ShowMa(NULL, (WORD)GetSafeHwnd());
        
        // 4. 釋放介面指標
        pmaCom->Release();
    }
    
    // 5. 反初始化 COM
    CoUninitialize();
}

關鍵檔案對應關係

檔案來源用途
madll.dllDelphi 編譯COM 伺服器執行體,需註冊
madll.idlDelphi 產生介面定義語言原始碼
madll.hMIDL 編譯 madll.idlC++ 介面宣告、虛函數表定義
madll_i.cMIDL 編譯 madll.idlCLSID/IID/GUID 實際數值定義

註冊與部署注意事項


// 註冊(管理員權限)
regsvr32 madll.dll

// 反註冊
regsvr32 /u madll.dll

// 若 DLL 不在系統路徑,需指定完整路徑
regsvr32 "C:\MyProject\madll.dll"

常見問題排查

  • CoCreateInstance 返回 CLASS_E_CLASSNOTAVAILABLE (0x80040154):DLL 未正確註冊,或位元數不匹配(32/64 位元)
  • 連結錯誤 LNK2001:未解析的外部符號 CLSID_maCom:未將 madll_i.c 加入專案編譯
  • 執行時存取違規:介面定義不匹配(參數順序、型別、呼叫慣例),需核對 IDL 與 Delphi 實作

雙向互操作驗證

作者附帶原始碼包含兩個專案:

  • DelphiCallVCCOM.zip:Delphi 呼叫 VC COM
  • VCCallDelphiCOM.zip:VC 呼叫 Delphi COM(本文主角)

雙向驗證證明 COM 的語言中立特性,關鍵在於標準化的 IDL 定義與二進制介面契約。

總結

VC 呼叫 Delphi COM 的核心流程:Delphi 產出 IDL → MIDL 編譯產生 C++ 標頭/識別碼檔 → VC 專案引入並以標準 COM API 呼叫。掌握 IDL 到 C++ 定義的轉換機制,即可打通任意語言邊界的元件復用通道。

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