3

我正在尝试使用 .NET COM-dll,它是用于步进电机控制接口的 SDK 的一部分。SDK 提供了一个类型库,我通过“导入组件 > 导入类型库”将其导入 Delphi。

虽然我知道一些关于 COM 编程的基础知识,但我很难让接口正常工作。问题似乎是 CoClass 以及 OLE 服务器代理只公开了一个空接口,即没有任何方法的接口 ( _ComMotorCommands )。从那里转换到实际的IComMotorCommands 会产生一个Interface not supported错误。

// *********************************************************************//
// 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”类型的变量,然后就可以自由访问所有接口方法。)

我将通过电子邮件应要求提供完整文件。

我在这里不知所措,所以对此的任何帮助将不胜感激!

4

1 回答 1

1

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

于 2012-12-13T13:34:49.203 回答