2

我在将一些 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 是第一个提出问题出在其他地方的想法,所以我接受他的回答主要是因为它为我指明了正确的方向。谢谢大家!

4

2 回答 2

3

如上所述,您的处理RSI_CHANNEL是正确的。将其声明为Pointer适当的操作。为了使类型安全性更强,您可以定义不同的类型而不是别名:

Type 
  RSI_CHANNEL = type Pointer;

如果port参数是真的WORD那么映射到Word德尔福。

至于你的问题,它在别处。翻译RSI_CHANNEL准确。

于 2014-08-14T20:15:42.080 回答
2

由于RSI_CHANNEL是 C 代码中的类型化指针,我将在 Delphi 中声明一个类似的类型化指针来匹配,而不是使用无类型的Pointer(这也与现代 Delphi 版本内联,STRICT用于避免 Win32 API 句柄类型中的无类型指针HWND等) :

type
  RSI_CHANNEL = ^__RSI_CHANNEL;
  __RSI_CHANNEL = record
  end;       

Function rsiInitWsock(HostName : PAnsiChar; port : WORD) : RSI_CHANNEL; stdcall; external 'rsidll32';
于 2014-08-14T20:48:05.103 回答