Нарушение доступа во время запуска программы Delphi 6 в вызове API Windows GetKeyboardType () - PullRequest
2 голосов
/ 18 марта 2012

У меня есть приложение 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 или библиотек, поэтому я полагал, что сообщения являются ложными. Возможно, здесь есть какая-то странная запутанность, которую мне нужно сначала исправить?

1 Ответ

0 голосов
/ 26 марта 2012

Это очень просто. Это исключение выдает в случае отсутствия необходимого модуля dll. В моем случае это был Full_DebugMode.dll

...