为什么不能Indy 10初始化?

我在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有依赖性,所以在那里。

有没有人知道为什么这个代码之前工作正常(在德尔福2007年),现在(在德尔福2009年)它突然中断?

这是无法重新打开ws2_32 DLL的常识,或者这里真的有什么问题吗? (我没有检查:我的系统上只有这些DLL的一个版本)。

更好:任何人都可以帮我解决这个问题吗?


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


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


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

链接地址: http://www.djcxy.com/p/91097.html

上一篇: Why can't Indy 10 initialize?

下一篇: How can I stop forms from opening on Delphi IDE startup