将 C 声明转换为 Delphi XE2

标签 c delphi pointers dll opaque-pointers

我在从一些 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/

相关文章:

mysql - 如何在 Delphi 7 中连接 FastReport 和 MySQL 5.5?

delphi - WM_COPYDATA : Can the receiver modify the COPYDATASTRUCT contents?

delphi - 如何使用 VCL 类的接口(interface)?

c++ - Malloc、指针和变量

c++ - 将多维数组作为 void * 传递给 extern "C"函数

c++ - 为什么我可以在 C 中将 int 文字隐式转换为 int * 而在 C++ 中却不能?

c - double 和整数的求和和乘法不起作用

c++ - 使用嵌入式硬件进行测试自动化

c - fopen() 的非 ascii 文件名

c - 数字的大小