DelphiXE2 vs Delphi7。 DLL行为取决于调用进程

时间:2012-04-10 10:16:02

标签: delphi dll delphi-xe2

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

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

感谢任何想法。

2 个答案:

答案 0 :(得分:2)

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

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

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

  1. openSocket(yourPort,PAnsiChar(UTF8Encode(name)))其中name为string类型(您将看到警告)
  2. 在nodave.pas中将所有pchar重命名为PAnsiChar并使用AnsiStringPAnsiString代替stringpchar。< / LI>

答案 1 :(得分:1)

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

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

  

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

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

  

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

不,你不能让XE2编译器像D7编译器一样。

  

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

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