2008-10-15 9 views
1

J'ai un problème avec un projet Delphi 2009: Il ne peut pas initialiser Indy 10! Ce code a bien fonctionné avant Delphi 2007 (bien que nous ayons pu utiliser une ancienne révision d'Indy, mais je suppose que cela n'a pas grand chose à voir avec ça);Pourquoi Indy 10 ne peut-il pas s'initialiser?

L'appel initial à IdWinsock2.InitializeWinSock(), soulève cette exception (avec le code d'erreur 998):

Project EAServer.exe raised exception class EIdWinsockStubError with message 
'Error on loading Winsock2 library (WS2\_32.DLL): Invalid access to memory location'. 

Mais ws2_32.dll est dans C: \ Windows \ System32 Allright, avec ces détails de la version:

File Version : 5.1.2600.5512 (xpsp.080413-0852) 
Description : Windows Socket 2.0 32-Bit DLL 
Copyright : © Microsoft Corporation. All rights reserved. 

(cela montre que je suis sous WinXP btw). La chose idiote est, que lorsque je regarde le processus lui-même (en utilisant "Process Explorer"), je peux voir que le processus a déjà ouvert cette DLL. La raison "WS2_32.DLL" est déjà chargée, semble être parce que nous utilisons aussi l'unité RTL Winsock.pas dans ce projet. Cette unité est liée statiquement à "wsock32.dll", qui a une dépendance sur WS2_32.DLL, donc là.

Est-ce que quelqu'un sait pourquoi ce code a bien fonctionné avant (dans Delphi 2007), et maintenant (dans Delphi 2009) il se brise soudainement?

Et est-ce l'incapacité de rouvrir la connaissance commune ws2_32 dll, ou est-il vraiment quelque chose de mal ici? (J'ai vérifié: je n'ai qu'une version de ces DLL présentes sur mon système).

Mieux encore: Quelqu'un peut-il m'aider à résoudre ce problème?

+0

Avez-vous exécuté ProcMon ou FileMon en passant ces lignes dans Indy? Pouvez-vous écrire un programme court et simple qui reproduit le problème au minimum? Le même problème se produit-il sur toutes les machines ou sur une seule machine? –

+0

Ouais, ça arrive aussi sur d'autres postes de travail. Je vais essayer de reproduire ce comportement dans une petite application de test, pour identifier quel facteur est responsable de cela. – PatrickvL

Répondre

2

J'ai finalement trouvé une réponse à ceci: Les applications affectées contenaient un peu d'accrochage de code qui endommageait aléatoirement des parties de System.dcu! (FYI: Nous utilisons une version bêta de Delphi 2009 de la bibliothèque de madshi's madCodeHook). Dès que nous sommes passés à une autre bibliothèque d'accrochage de code, ces symptômes ont disparu ... Je suppose que c'est ce qui se passe quand vous utilisez un logiciel bêta. De toute façon, désolé de t'avoir dérangé avec ça. Problème résolu!

0

Cela peut être trop simpliste, mais avez-vous essayé de changer l'ordre dans lequel les unités pertinentes sont listées dans votre clause uses? Parfois, cela aide dans ces situations.

0

Je pense qu'il pourrait être un problème avec les appels Ansi/Unicode de Win32 API (y compris l'API WinSock). Vérifiez si le code en utilisant AnsiString/AnsiPchar appelle les fonctions XxxA (par exemple MessageBoxA), et String/Pchar appelle la fonction xxW (par exemple MessageBoxW). Dans les versions précédentes de Delphi String était alias à AnsiString et XxxA Win API fonction a été utilisée, mais maintenant String est unicode par défaut et les fonctions XxxW doivent être utilisés.

Questions connexes