【发布时间】: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