我試圖使用一個.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'類型的變量,然後可以自由訪問所有接口方法。)
我將通過電子郵件提供完整的文件。
我在這裏頭,所以任何幫助,將非常感激!
這可能是一個位衝突。在配置文件模式下的Dependency Viewer下運行該程序,並查看哪個模塊負載會觸發該錯誤。然後檢查該模塊是否爲64位。 –
謝謝大衛!但是我不太確定'profile profile'中的'Dependency Viewer'是什麼意思。請你指點正確的方法嗎? –
對不起。它叫做Dependency Walker。去谷歌上查詢。加載它。轉到配置文件菜單項。選擇你的exe。然後去。你會得到大量的診斷信息,希望能夠隔離無法加載的模塊。 –