我在从一些 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)
- Windows 7 x64
我发现了问题;这与我的代码无关,从一开始就是对的;它与 DLL 中的 ping 函数有关,它可以在笔记本电脑上运行,但不想在台式电脑(均为 Win7)上运行,并且当它不起作用时,它会中断对 DLL 的后续函数调用(为什么,我还不知道……)。不管怎样,这不是一个完整的解决方案,但@DavidHeffernan 是第一个提出问题出在其他地方的想法的人,所以我接受他的答案主要是因为它为我指明了正确的方向。谢谢大家!
最佳答案
如上所述,您对 RSI_CHANNEL
的处理是正确的。将其声明为 Pointer
是适当的操作。为了使类型安全性更强,您可以定义不同的类型而不是别名:
Type
RSI_CHANNEL = type Pointer;
如果port
参数确实是WORD
,那么它映射到Delphi中的Word
。
至于你的问题,它出在其他地方。 RSI_CHANNEL
的翻译是准确的。
关于将 C 声明转换为 Delphi XE2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316449/