1

我的机器上安装了 Delphi7 和 DelphiXE2(均为 32 位)。我需要使用来自 dll 'libnodave.dll' 的函数 openSocket()。

问题是,在 Delphi7 和 D7 编译的 .exe 文件中,此函数会立即执行并返回一些整数值,但在 DelphiXE2 中它会停止 3 秒(我猜是超时)并返回零。我试图在 D7 中编写一种“代理 dll”,女巫在内部从原始 dll 调用相同的函数,但它不起作用。现在我很感兴趣,除了本地函数参数之外,还有哪些程序执行的其他信息传递给了 dll。根据谁调用该函数,库如何影响其行为。有没有办法将 DelphiXE 编译器设置为 D7 编译器?另一个小问题:调试时如何查看程序中定义的所有全局参数(如 {$DEFINE WIN32})。

感谢您的任何想法。

4

2 回答 2

2

在 Delphi 7 和 XE2 中调用 dll 函数没有区别。但是函数声明为

function openSocket(port:longint;name:pchar):longint; stdcall;
    external LibName {$ifdef WIN32} name 'openSocket'{$ENDIF};

其中 PChar在 Delphi 7 中,但在 XE2 中是AnsiCharUnicode ( )。WideChar我猜它仍然是这个 dll 中的 AnsiChar,你可以:

  1. openSocket(yourPort, PAnsiChar(UTF8Encode(name))) 其中名称是string类型(您将看到警告)
  2. 在 nodave.pas 中重命名所有出现的pcharto并使用and代替and 。PAnsiCharAnsiStringPAnsiStringstringpchar
于 2013-06-13T16:39:31.727 回答
1

问题是,在 Delphi7 和 D7 编译的 .exe 文件中,此函数会立即执行并返回一些整数值,但在 DelphiXE2 中它会停止 3 秒(我猜是超时)并返回零。

函数的声明是什么openSocket()样的?两个版本的调用约定是否匹配?函数有String参数吗?请记住,String在 D7 中是 Ansi,在 DXE2 中是 Unicode。确保使用相同的调用约定声明函数,并且在两个版本中使用正确的数据类型声明所有参数。

除了本地函数参数之外,我对程序执行的其他信息是否传递给 dll 感兴趣。

除了参数值之外,没有任何信息传递给函数。

有没有办法将 DelphiXE 编译器设置为 D7 编译器?

不,您不能让 XE2 编译器像 D7 编译器一样工作。

调试时如何查看程序中定义的所有全局参数(如 {$DEFINE WIN32})。

无法在调试时查看活动的编译器定义。但是,在编辑时,有一个键盘快捷键Ctrl++ ,可以将当前活动的 DEFINE 插入到您的源代码中OO

于 2012-04-10T16:41:28.340 回答