2008-10-15 4 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 Allright, с этими деталями версии:

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

(это показывает, что я нахожусь на WinXP кстати).

Глупые вещи в том, что когда я смотрю на сам процесс (используя «Process Explorer»), я вижу, что процесс уже открыл эту DLL. Причина «WS2_32.DLL» уже загружена, похоже, потому, что мы также используем модуль RTL Winsock.pas в этом проекте. Данное устройство статически связано с «wsock32.dll», которое имеет зависимость от WS2_32.DLL, поэтому есть.

Кто-нибудь знает, почему этот код работал нормально раньше (в Delphi 2007), и теперь (в Delphi 2009) он внезапно ломается?

И это неспособность повторно открыть общеизвестное dll ws2_32, или здесь действительно что-то не так? (Я проверял: у меня только 1 версия этих DLL присутствует в моей системе).

Еще лучше: может ли кто-нибудь помочь мне исправить это?

+0

Запустили ли вы ProcMon или FileMon при переходе по этим строкам в Indy? Можете ли вы написать небольшую простую программу, которая минимально воспроизводит проблему? Происходит ли такая же проблема на всех машинах или только на одной машине? – 2008-10-15 18:32:05

ответ

2

Наконец-то я нашел ответ на этот вопрос: В затронутых приложениях содержалось несколько кодов, которые случайно повреждали части System.dcu! (FYI: Мы используем бета-версию Delphi 2009 в библиотеке madCodeHook от madshi). Как только мы переключились на другую библиотеку для перехвата кода, эти симптомы исчезли ... Наверное, это то, что происходит, когда вы используете бета-программное обеспечение. Во всяком случае, извините за то, что беспокоило вас этим. Задача решена!

0

Это может быть слишком упрощенным, но попробовали ли вы изменить порядок, в котором соответствующие единицы указаны в разделе использования? Иногда это помогает в таких ситуациях.

0

Я думаю, что это может быть проблема с вызовами Ansi/Unicode Win32 API (включая WinSock API). Убедитесь, что код с использованием AnsiString/AnsiPchar вызывает функции XxxA (например, MessageBoxA) и функцию вызова xxW для String/Pchar (например, MessageBoxW). В предыдущих версиях Delphi String был псевдоним AnsiString, и была использована функция XxxA Win API, но теперь String по умолчанию имеет unicode, а функции XxxW должны использоваться.

Смежные вопросы