【问题标题】:COM Interface - Connection to device failsCOM 接口 - 连接到设备失败
【发布时间】:2014-10-15 13:04:42
【问题描述】:

我正在使用 COM 接口连接到通过 TCP/IP 连接到运行软件的计算机的外部设备。我发布了这个,因为在一个系统上这个连接神秘地失败了。

从制造商处,我收到了一个 instrument.dll 和一个 instrument.tlb。很遗憾,细节和代码受保密协议约束,所以我只能提供伪代码。

我有两个最小的例子,一个是关于 Free Pascal(重要的一个,因为这是我正在开发的地方):

uses
   Instrument_TLB; // Imported via the Lazarus "Import Type Library" function from the .tlb or the .dll

[...]

procedure TForm1.FormCreate(Sender: TObject);
begin
  AInstrument := CoInstrument.Create;
  if AInstrument.Connected then ...
end;

一个在 Visual Basic 上,由制造商提供:

Private Sub Form_Load()
   Set theInstrument = New Instrument
   If theInstrument.Connected Then ...
End Sub

这个 VB6 项目有 instrument.dll 作为参考。

不同计算机上的行为如下(补充来自Sysinternals Process Explorer的信息):

  • 系统 A(Windows XP,32 位,用于编译):FP 和 VB 可执行文件都按预期工作,可以建立连接。在 Process Explorer 中,两个可执行文件都有一个带有 instrument.dll 的线程,并且可以看到 TCP/IP 连接已启动。

  • 系统 B(Windows 7,64 位):FP 和 VB 可执行文件都按预期工作,可以建立连接。未使用进程资源管理器。

  • System C(Windows 7,64 位):VB 可执行文件按预期工作,可以建立连接。在 Process Explorer 中,VB 可执行文件有一个带有 instrument.dll 的线程,并且可以看到 TCP/IP 连接已启动。 FP 可执行文件无法连接,有 两个 线程与 instrument.dll 和 no 在 Process Explorer 中看到 TCP/IP 连接。

我知道,根据我所能提供的少量信息,没有人可以提出“解决方案” - 但是,关于如何进一步调查此问题的建议,以及用于调试的工具将不胜感激!

感谢您的宝贵时间。

【问题讨论】:

  • VB 使用 COM 自动化。我建议你在 Lazarus 中使用相同的机制。 (Lazarus 是否允许您导入类型库?)。
  • DLL 是 32 位还是 64 位? FP 应用程序是 32 位还是 64 位?您是否确保在调用CoInstrument.Create() 之前调用了CoInitialize/Ex()?应用失败时,是否有报错信息?
  • @RemyLebeau FP 应用程序和 DLL 都是 32 位的,调用 CoInitialize。 .Create 成功(无异常),但 .Connected 永远不会返回 true,并且所有其他方法调用都会返回错误状态。
  • @LeRookie:您是否嗅探过网络以确保 DLL 确实在尝试连接到服务器?除非 DLL 公开错误信息,例如通过GetErrorInfo(),否则您很可能必须与制造商讨论此问题,以便他们可以调试 DLL。这里的任何人都无法为您解决此类问题。
  • COM 在函数返回中返回错误信息。在 VB 中,它可能看起来像返回数据,但数据是函数的输出参数,错误是返回值。无论如何,请参阅stackoverflow.com/questions/25153262/… 了解如何调试。键入x 列出符号,键入bp symbolname 设置断点。 kb 列出堆栈和参数。

标签: delphi tcp com vb6 freepascal


【解决方案1】:

事实证明,系统 C 上的注册表包含有关如何连接到仪器的多个条目,其中一个条目的 IP 地址稍有错误。我不知道为什么我的 32 位 FP 软件使用了这个密钥,而 32 位 VB6 测试应用程序使用了另一个密钥,但更改 IP 地址是一个因素。

另一个因素是在 Windows 7 SP1 上以 Windows 7 的兼容模式运行该软件。我不知道为什么这是必要的(因为它在系统 B 上的 Windows SP1 上没有兼容模式下工作),但我想尽快摆脱它......

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多