【发布时间】: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