2008-10-15 139 views
1

我有一个Delphi 2009项目的问题:它无法初始化Indy 10! 这段代码在Delphi 2007之前工作得很好(虽然我们可能已经使用了Indy的旧版本,但我怀疑这跟它没有多大关系);为什么不能Indy 10初始化?

到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的一个版本)。

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

+0

当你在Indy的这些行上跳过时,你运行过ProcMon还是FileMon? 你能写一个简短的简单程序来最小程度地重现问题吗? 所有机器或只有一台机器上是否出现同样的问题? – 2008-10-15 18:32:05

回答

2

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

0

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

0

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

相关问题