【问题标题】:Access Violation during Delphi 6 program startup in GetKeyboardType() Windows API callGetKeyboardType() Windows API 调用中 Delphi 6 程序启动期间的访问冲突
【发布时间】:2023-03-18 17:15:02
【问题描述】:

我有一个 Delphi 6 应用程序,它在我的一台 PC 上运行良好。我最近花了一天时间将我的整个编程环境复制到另一台 PC,因为我一直在努力解决的错误只发生在另一台 PC 上。我移动了所有代码、JEDI JVCL 3.0 等库以及所有其他必要的库,复制了环境和项目路径,并安装了所有必要的 VCL 组件等。注意,我使用 FastMM4 作为我的内存管理器.

但是,当我尝试运行 Delphi 6 应用程序时,我在程序初始化时遇到访问冲突。 System 单元在 GetKeyboardType() Windows API 调用期间出现以下函数:

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 继续。
  • 最初程序是从 MSVCR80.dll 抛出 A/V。我不知道为什么会发生这种情况,因为我认为我的任何代码都没有使用那个 DLL,所以我找到了那个 DLL 的所有副本,并通过将它们重命名为 .sav 来消除它们。然后我重建并继续前进。
  • CPU 窗口显示在名为 ntdll.KiUserCallbackDispatcher() 的内核函数内部的汇编程序 CALL 语句期间发生的错误。

谁能给我一些东西来尝试纠正这个问题?

更新:我将 MSVCR80.DLL 恢复为正确名称以进行更多测试。如果我这样做,那么当 SysUtils 初始化时我会得到一个 A/V。我在 initialization 语句上放置了一个断点。一旦我越过那条线,我就会在内存管理器的深处得到一个 A/V。调用堆栈显示:

@GetMem(???)
@NewAnsiString(???)
@StartExe(???)
@InitExe(???)
[the project name]

似乎 MSVCR80.DLL 以某种方式绑定到内存管理器中,并且在内存分配期间发生了故障。当我复制编程环境时,我记得当我从 添加和删除程序 控制面板小程序运行 Delphi 安装程序时看到了几个 .NET 警告。在安装最新的之前,我需要删除一些旧的 Indy 组件,所以我使用了 Delphi 安装程序的 Modify 选项。在此过程中,我收到了几个关于 .NET 的警告框。我没有写下这些消息,因为我的 Delphi 应用程序不使用任何 .NET DLL 或库,所以我认为这些消息是虚假的。也许这里有一些奇怪的纠缠需要我先解决?

【问题讨论】:

  • 您是否在“干净”的 VM 中尝试过您的应用程序?也许这个系统有些“特别”......

标签: .net delphi access-violation vcl


【解决方案1】:

这很简单。如果缺少所需的 dll 模块,则会引发此异常。就我而言,它是 Full_DebugMode.dll

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多