我正在尝试使用.NET COM-dll,它是步进电机控制界面SDK的一部分。 SDK提供了一个类型库,我通过'Import Component>导入到Delphi中。导入类型库'。
虽然我知道一些关于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 :(得分:1)
最有可能的问题是尝试加载64位模块。在配置文件模式下使用Dependency Walker进行调试。