2008-10-15 101 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函數。