我在将某些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中实现?而且,¿我做错了什么?提前致谢。
额外细节:
我发现了问题;它与我的代码无关,从一开始就是对的。它必须与DLL中的ping函数有关,它可以在笔记本电脑上使用,但不希望与台式机(都为Win7)一起使用,并且当它不起作用时,它将中断对DLL的后续函数调用(为什么,我还不知道...)。无论如何,这不是一个完整的解决方案,但是@DavidHeffernan是第一个提出问题在其他地方的想法的人,所以我接受他的回答主要是因为它为我指明了正确的方向。谢谢大家!
如上所述,您对的处理RSI_CHANNEL
是正确的。将其声明为Pointer
适当的操作。为了增强类型安全性,您可以定义一个不同的类型而不是一个别名:
Type
RSI_CHANNEL = type Pointer;
如果port
参数确实是,WORD
则Word
在Delphi中映射到。
至于您的问题,它在其他地方。的翻译RSI_CHANNEL
是准确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句