2012-12-13 27 views
3

我試圖使用一個.NET COM-dll,它是步進電機控制接口的SDK的一部分。 SDK提供了一個類型庫,我通過「導入組件>導入類型庫」導入到了Delphi中。通過導入的類型庫訪問COM-dll失敗

雖然我知道一些關於COM編程的基礎知識,但我很努力使接口工作。問題似乎是CoClass以及OLE服務器代理僅暴露空接口,即沒有任何方法的接口( _ComMotorCommands)。從那裏投射到實際的 IComMotorCommands產生一個接口不支持錯誤。

// *********************************************************************// 
// Interface: IComMotorCommands 
// Flags:  (4416) Dual OleAutomation Dispatchable 
// GUID:  {0D4E3A3F-0C07-438B-9F6F-CC1968408CFC} 
// *********************************************************************// 
    IComMotorCommands = interface(IDispatch) 
    ['{0D4E3A3F-0C07-438B-9F6F-CC1968408CFC}'] 
    function Get_ErrorFlag: WordBool; safecall; 
    function Get_ErrorMessageString: WideString; safecall;  
    function Get_ErrorNumber: Integer; safecall; 
    ... 
    end; 

... 

// *********************************************************************// 
// Interface: _ComMotorCommands 
// Flags:  (4432) Hidden Dual OleAutomation Dispatchable 
// GUID:  {5AB3EB9E-E847-3133-95DC-4DDC7870C02A} 
// *********************************************************************// 
    _ComMotorCommands = interface(IDispatch) 
    ['{5AB3EB9E-E847-3133-95DC-4DDC7870C02A}'] 
    end; 

... 

    CoComMotorCommands = class 
    class function Create: _ComMotorCommands; 
    class function CreateRemote(const MachineName: string): _ComMotorCommands; 
    end; 

我也試圖通過

CreateComObject(CLASS_ComMotorCommands) as IComMotorCommandsDisp 

創建手動接口本身不拋出異常。即使設置一些連接屬性,如端口和波特率似乎也可以工作。但是,只要我嘗試查詢電機狀態,我就會得到

'BadImageFormatException:嘗試加載格式不正確的程序。 (異常來自HRESULT:0x8007000B)」

你要知道,在我的應用程序異常,但通過接口本身( Get_ErrorMessageString)的錯誤報告機制。

此錯誤通常表示x86和x64代碼之間的位差衝突。但是我的平臺目標是x86,就像SDK一樣。我在Windows 7 x64上運行Delphi XE3,但同樣的錯誤也出現在我試過的32位機器上,這對我來說沒有任何意義。

SDK還爲VB,C++和C#提供了幾個Visual Studio示例。但他們都使用Visual Studio調用界面的方式,對我沒有任何幫助。 (你可以直接參考TLB,只需聲明一個'ComMotorCommands'類型的變量,然後可以自由訪問所有接口方法。)

我將通過電子郵件提供完整的文件。

我在這裏頭,所以任何幫助,將非常感激!

+0

這可能是一個位衝突。在配置文件模式下的Dependency Viewer下運行該程序,並查看哪個模塊負載會觸發該錯誤。然後檢查該模塊是否爲64位。 –

+0

謝謝大衛!但是我不太確定'profile profile'中的'Dependency Viewer'是什麼意思。請你指點正確的方法嗎? –

+0

對不起。它叫做Dependency Walker。去谷歌上查詢。加載它。轉到配置文件菜單項。選擇你的exe。然後去。你會得到大量的診斷信息,希望能夠隔離無法加載的模塊。 –

回答

1

這個問題很可能是加載64位模塊的嘗試。在配置文件模式下使用Dependency Walker進行調試。

+0

再次感謝您的幫助,David。我能夠追蹤rs485_com.dll的32位版本。現在界面工作得很好! –

+0

不客氣,我很高興得到了協助。 –