1

我有一个 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 顺便说一句)。

愚蠢的是,当我查看进程本身时(使用“进程资源管理器”),我可以看到进程已经打开了这个 DLL。“WS2_32.DLL”已经加载的原因,似乎是因为我们在这个项目中也使用了RTL单元Winsock.pas。这个单元静态链接到“wsock32.dll”,它依赖于WS2_32.DLL,所以在那里。

有谁知道为什么这段代码之前(在 Delphi 2007 中)运行良好,而现在(在 Delphi 2009 中)它突然中断了?

而且这个是无法重新打开ws2_32 dll常识,还是这里真的有什么问题?(我确实检查过:我的系统上只有这些 DLL 的 1 个版本)。

更好的是:谁能帮我解决这个问题?

4

3 回答 3

2

我终于找到了答案:受影响的应用程序包含一些随机损坏 System.dcu 部分的代码挂钩!(仅供参考:我们使用的是 madshi 的 madCodeHook 库的 Delphi 2009 beta 版本)。一旦我们切换到另一个代码挂钩库,这些症状就消失了……我想这就是您使用 beta 软件时会发生的情况。无论如何,很抱歉打扰你。问题解决了!

于 2008-11-04T13:55:28.413 回答
0

这可能过于简单,但您是否尝试过更改相关单位在您的使用条款中列出的顺序?有时这在这些情况下会有所帮助。

于 2008-10-16T00:56:08.693 回答
0

我认为这可能是 Win32 API(包括 WinSock API)的 Ansi/Unicode 调用的问题。检查使用 AnsiString/AnsiPchar 的代码是否调用 XxxA 函数(例如 MessageBoxA),以及 String/Pchar 是否调用 xxW 函数(例如 MessageBoxW)。在以前的 Delphi 版本中,String 是 AnsiString 的别名,使用了 XxxA Win API 函数,但现在 String 默认为 unicode,应该使用 XxxW 函数。

于 2008-10-17T08:37:23.223 回答