我在将一些 C 声明转换为 Delphi XE2 以调用 DLL 中的函数时遇到问题。我翻译了 Visual Basic 源文件中的所有函数声明,但在测试它们时遇到了问题。一些函数返回 Long 值,但在调试我的代码时我观察到这些函数所涉及的返回值是不正确的。然后我转向 C 中的原始代码,在那里我找到了问题的根源:在原始 C 代码中的某个点有这样的声明:
typedef struct { } __RSI_CHANNEL;
typedef __RSI_CHANNEL FAR* RSI_CHANNEL;
现在,一些函数返回 RSI_CHANNEL;这些函数返回值如下:
return (RSI_CHANNEL)ws;
并且 ws 被声明为:
rsiChannel FAR* ws = new FAR rsiChannel;
rsiChannel 是一个 typedef 结构。到目前为止,一切都很好......到目前为止,我想你们中的一些人可能已经认识到这是 PIMPL 成语。好的,根据源代码注释,我应该保存该返回值(RSI_CHANNEL)并针对 NULL 进行测试,并通过未触及的函数调用传递它......仅此而已......所以我认为它应该在 Delphi 中实现作为指针。但它不起作用。像这样的东西:
Type
RSI_CHANNEL = Pointer;
...{ later in implementation block }...
Function rsiInitWsock(HostName : PAnsiChar; port : Long) : RSI_CHANNEL; stdcall; external 'rsidll32';
没有编译错误,没有运行时错误。如果我调用这个函数,我会得到 Nil。
¿ 知道如何在 Delphi XE2 中实现这一点吗?并且,¿我做错了什么?提前致谢。
额外细节:
- Delphi XE2(目标:Win32)
- 视窗 7 x64
我发现了问题;它与我的代码无关,从一开始就是正确的;它与 DLL 中的 ping 函数有关,它可以在笔记本电脑上工作,但它不想与台式机(Win7)一起工作,当它不工作时,它会中断对 DLL 的后续函数调用(为什么,我不知道......但)。无论如何,这不是一个完整的解决方案,但@DavidHeffernan 是第一个提出问题出在其他地方的想法,所以我接受他的回答主要是因为它为我指明了正确的方向。谢谢大家!