我对Delphi 2009项目有疑问:它无法初始化Indy 10! 这段代码在Delphi 2007之前运行良好(虽然我们可能一直在使用Indy的旧版本,但我怀疑它与它没什么关系);
对IdWinsock2.InitializeWinSock()的初始调用引发了此异常(错误代码为998):
Project EAServer.exe raised exception class EIdWinsockStubError with message
'Error on loading Winsock2 library (WS2\_32.DLL): Invalid access to memory location'.
但是ws2_32.dll在C:\ Windows \ System32中可以使用这些版本的详细信息:
File Version : 5.1.2600.5512 (xpsp.080413-0852)
Description : Windows Socket 2.0 32-Bit DLL
Copyright : © Microsoft Corporation. All rights reserved.
(这表明我正在使用WinXP btw)。
愚蠢的是,当我查看进程本身(使用“Process Explorer”)时,我可以看到进程已经打开了这个DLL。 “WS2_32.DLL”已经加载的原因似乎是因为我们在这个项目中也使用了RTL单元Winsock.pas。 这个单元静态链接到“wsock32.dll”,它依赖于WS2_32.DLL,所以那里。
有没有人知道为什么这段代码在Delphi 2007之前工作正常,现在(在Delphi 2009中)突然中断了?
这是否无法重新打开ws2_32 dll的常识,或者这里真的有问题吗? (我确实检查过:我的系统上只有这个DLL的1个版本)。
更好的是:有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
我终于找到了一个答案:受影响的应用程序包含一些代码挂钩,随机损坏了System.dcu的部分! (仅供参考:我们正在使用madshi的madCodeHook库的Delphi 2009测试版)。一旦我们切换到另一个代码挂钩库,这些症状就会消失......我想这就是使用beta软件时会发生什么。无论如何,抱歉打扰你。问题解决了!
答案 1 :(得分:0)
这可能过于简单了,但您是否尝试更改使用条款中列出相关单位的顺序?有时候这有助于这些情况。
答案 2 :(得分:0)
我认为这可能是Win32 API的Ansi / Unicode调用(包括WinSock API)的问题。检查使用AnsiString / AnsiPchar的代码是否调用XxxA函数(例如MessageBoxA),以及String / Pchar调用xxW函数(例如MessageBoxW)。在以前版本的Delphi中,String是AnsiString的别名,使用了XxxA Win API函数,但现在String默认为unicode,应该使用XxxW函数。