2008-10-15 2 views
1

Delphi 2009 프로젝트에 문제가 있습니다. Indy 10을 초기화 할 수 없습니다! Delphi 2007에서이 코드는 정상적으로 작동했습니다 (이전 버전의 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'. 

을하지만 C에 WS2_32.DLL입니다 : \ 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입니다.)

"프로세스 탐색기"를 사용하여 프로세스 자체를 보면 프로세스가 이미이 DLL이 열려있는 것을 볼 수 있습니다. "WS2_32.DLL"이 이미로드 된 이유는이 프로젝트에서도 RTL 유닛 Winsock.pas를 사용하고 있기 때문인 것으로 보입니다. 이 장치는 WS2_32.DLL에 종속되어있는 "wsock32.dll"에 정적으로 링크되어 있으므로 거기에 있습니다.

누구든지이 코드가 (Delphi 2007에서) 잘 작동하는 이유를 아는 사람 있습니까? (Delphi 2009에서) 갑자기 중단 되니?

그리고 ws2_32 dll 일반 지식을 다시 열 수 없습니까? 아니면 여기에 정말로 잘못된 것이 있습니까? (나는 확인했다. 나는이 DLL이 내 시스템에 1 버전 밖에 없다.)

더 나은 점은 누구나 해결할 수 있습니까?

+0

ProyMon 또는 FileMon을 실행하여 Indy에서이 단계를 건너 뛰었습니까? 문제를 최소한으로 재생하는 간단하고 간단한 프로그램을 작성할 수 있습니까? 모든 컴퓨터에서 동일한 문제가 발생합니까 아니면 하나의 컴퓨터에서만 발생합니까? –

+0

네, 다른 워크 스테이션에서도 발생합니다. 작은 테스트 응용 프로그램에서이 동작을 재현하여 어떤 요소가 이에 영향을 미치는지 정확히 알려줍니다. – PatrickvL

답변

2

마지막으로 나는 이것에 대한 답을 찾았습니다. 영향을받는 응용 프로그램에는 System.dcu의 임의 부분이 손상된 코드 후킹이 포함되어 있습니다. (참고 : 우리는 madshi의 madCodeHook 라이브러리의 Delphi 2009 베타 버전을 사용하고 있습니다). 다른 코드 후킹 라이브러리로 전환하자마자 이러한 증상은 사라졌습니다 ... 베타 소프트웨어를 사용하면 이러한 현상이 사라질 것입니다. 어쨌든,이 일로 귀찮게해서 미안해. 문제 해결됨!

0

이것은 지나치게 단순 할 수도 있지만 uses 절에 관련 단위가 나열되는 순서를 변경해 보았습니까? 때로는 이러한 상황에서 도움이됩니다.

0

Win32 API (WinSock API 포함)의 Ansi/Unicode 호출시 문제가 될 수 있다고 생각합니다. AnsiString/AnsiPchar을 사용하여 코드가 XxxA 함수 (예 : MessageBoxA)를 호출하고 String/Pchar이 xxW 함수 (예 : MessageBoxW)를 호출하는지 확인하십시오. Delphi의 이전 버전에서는 String이 AnsiString의 별칭이었고 XxxA Win API 함수가 사용되었지만 이제는 기본적으로 String이 유니 코드이며 XxxW 함수를 사용해야합니다.

관련 문제