通过导入的类型库访问COM-dll失败

时间:2012-12-13 11:42:44

标签: .net delphi dll com typelib

我正在尝试使用.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'类型的变量,然后可以自由地访问所有接口方法。)

我会根据要求通过电子邮件提供完整的文件。

我在这里,所以对此的任何帮助都将非常感激!

1 个答案:

答案 0 :(得分:1)

最有可能的问题是尝试加载64位模块。在配置文件模式下使用Dependency Walker进行调试。