У меня есть приложение Delphi 6, которое отлично работает на одном из моих компьютеров. Недавно я провел день, дублируя всю свою среду программирования на другом ПК, потому что ошибка, с которой я боролся, возникла только на этом другом ПК. Я перебрал весь код, библиотеки, такие как JEDI JVCL 3.0 и все остальные, которые необходимы, продублировал среду и пути проекта, установил все необходимые компоненты VCL и т. Д. Обратите внимание, я использую FastMM4 в качестве диспетчера памяти .
Однако, когда я пытаюсь запустить приложение Delphi 6, я получаю нарушение прав доступа при инициализации программы. Ошибка возникает в модуле System во время вызова Windows API GetKeyboardType () в следующей функции:
function _isNECWindows: Boolean;
var
KbSubType: Integer;
begin
Result := False;
if GetKeyboardType(0) = $7 then
begin
KbSubType := GetKeyboardType(1) and $FF00;
if (KbSubType = $0D00) or (KbSubType = $0400) then
Result := True;
end;
end;
Этого не происходит на моей основной станции разработки. Вот некоторые другие анекдотичные точки данных:
- Несмотря на отсутствие точек останова в источнике файла проекта, отладчик всегда останавливается на операторе «начало» в этом файле. Я нажимаю F9, чтобы продолжить.
- Первоначально программа выбрасывала A / V из MSVCR80.dll. Я не уверен, почему это произошло, так как я не думаю, что какой-либо из моего кода использует эту DLL, поэтому я нашел все копии этой DLL и кастрировал их, переименовав их в .sav. Затем я восстановил и продолжил.
- В окне ЦП отображается ошибка, возникающая во время оператора CALL на ассемблере, внутри функции ядра с именем ntdll.KiUserCallbackDispatcher () .
Может кто-нибудь дать мне несколько вещей, чтобы попытаться исправить эту проблему?
ОБНОВЛЕНИЕ : Я восстановил MSVCR80.DLL с его собственным именем, чтобы провести еще какое-то тестирование. Если я это сделаю, то получу A / V, когда SysUtils инициализируется. Я установил точку останова прямо в операторе initialization . Как только я перешагнул через эту линию, я получил A / V глубоко в диспетчере памяти. Стек вызовов показывает:
@GetMem(???)
@NewAnsiString(???)
@StartExe(???)
@InitExe(???)
[the project name]
Кажется, что MSVCR80.DLL как-то привязан к диспетчеру памяти и что-то взрывается во время выделения памяти. Когда я дублировал среду программирования, я помню пару предупреждений .NET, когда я запускал программу установки Delphi из апплета панели управления Установка и удаление программ . Мне нужно было удалить некоторые старые компоненты Indy перед установкой последних, поэтому я использовал опцию Modify программы установки Delphi. Во время этого процесса я получаю пару предупреждений о .NET. Я не записывал сообщения, так как мое приложение Delphi не использует никаких библиотек .NET DLL или библиотек, поэтому я полагал, что сообщения являются ложными. Возможно, здесь есть какая-то странная запутанность, которую мне нужно сначала исправить?