【问题标题】:App produces an exception on target computers应用程序在目标计算机上产生异常
【发布时间】:2020-09-13 17:40:49
【问题描述】:

我有一个使用它的简单应用:

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  Winapi.Windows, System.Variants, FMX.DialogService, TLHelp32,
  PlayForm, FMX.Platform, FMX.Media, FMX.Types, FMX.Controls, FMX.Forms,
  FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.StdCtrls, System.IOUtils,
  FMX.Controls.Presentation, FMX.Colors, FMX.Edit, FMX.Objects, FMX.ListBox;

然后它被编译并复制到另一台计算机上它会产生这个错误:

Exception EAccessViolation in module Kvigraonica.exe at 0054B0F7.

Access violation at address 0094B0F7 in module 'Kvigraonica.exe'. Read of address 0000000C.

OnCreate 事件是这样的:

procedure TfrmMain.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  try
    TDialogService.PreferredMode := TDialogService.TPreferredMode.Platform;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.jpg') then
    begin
      imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.jpg');
      imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.jpg';
    end;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.png') then
    begin
      imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.png');
      imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.png';
    end;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-a.gif') then
    begin
      imgTeamA.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-a.gif');
      imgTeamA.TagString := System.SysUtils.GetCurrentDir + '\team-a.gif';
    end;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.jpg') then
    begin
      imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.jpg');
      imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.jpg';
    end;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.png') then
    begin
      imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.png');
      imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.png';
    end;
    if tfile.Exists(System.SysUtils.GetCurrentDir + '\team-b.gif') then
    begin
      imgTeamB.LoadFromFile(System.SysUtils.GetCurrentDir + '\team-b.gif');
      imgTeamB.TagString := System.SysUtils.GetCurrentDir + '\team-b.gif';
    end;

  except on E: Exception do
    ShowMessage(e.Message);
  end;

end;

我有一个计时器:

procedure TfrmMain.tmr1Timer(Sender: TObject);
begin
  try

    if (cbbTeamA.Items.Count = 1) then
    begin
      EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamA));
    end
    else
    if (cbbTeamA.Items.Count = 0) or ((cbbTeamA.Selected <> nil) and (cbbTeamA.Selected.Index = 0)) then
    begin
      cbbTeamA.Clear;
      cbbTeamA.Items.AddObject('Izaberite VLC player Ekipu A', TObject(0));
      cbbTeamA.ItemIndex := 0;
      EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamA));
    end;

    if (cbbTeamB.Items.Count = 1) then
    begin
      EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamB));
    end
    else
    if (cbbTeamB.Items.Count = 0) or ((cbbTeamB.Selected <> nil) and (cbbTeamB.Selected.Index = 0))  then
    begin
      cbbTeamB.Clear;
      cbbTeamB.Items.AddObject('Izaberite VLC player za Ekipu B', TObject(0));
      cbbTeamB.ItemIndex := 0;
      EnumWindows(@EnumWindowsProc, LPARAM(cbbTeamB));
    end;
  except on E: Exception do
    ShowMessage(e.Message);
  end;
end;

我有更多的事件和程序,但我把我认为最重要的那些放在这里。现在,即使我注释掉所有事件和过程,我仍然有同样的错误:

Exception EAccessViolation in module Kvigraonica.exe at 0054B0F7.

Access violation at address 0094B0F7 in module 'Kvigraonica.exe'. Read of address 0000000C.

有什么 FMX 依赖的东西,所以我必须在目标系统上安装它吗?

更新

我发现问题出在我正在使用的样式书中。

我遵循了@StijnSanders 的建议(也有@TomBrunberg 的帮助),我得到了这个:

这是我查找来电者的时候:

【问题讨论】:

  • 您的代码中只是有一个错误。你需要调试。
  • “FMX 有什么依赖的,所以我必须在目标系统上安装它吗?”不,你可以很容易地通过简单的“你好,世界!”自己发现这一点。 FMX 应用程序并在第二台机器上运行它! :)
  • 这个错误真的可能在任何地方。但只是一个非常非常疯狂的猜测:您是否使用了正确的 EnumWindowsProc 调用约定?
  • 您需要在地址前加上一个“$”,因为地址是十六进制格式。
  • 代码TFormBorder.GetSupportedFMX.Forms.pas中。您现在可以在该函数的第一行放置一个普通断点。当执行在那里停止时,查看CallStack 窗口(IDE 中的左上角)您是如何到达这一点的。调用堆栈是颠倒的,执行顺序是从低行到高行。祝你好运!

标签: delphi firemonkey delphi-10.3-rio


【解决方案1】:

F7 使用调试器启动您的项目,这将启用“搜索”菜单下的“转到地址”选项。用它来查找地址$0094B0F7。可以选择阅读手册中有关调试的更多信息,以了解如何将程序运行到出现故障的地步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2015-06-04
    • 2015-02-15
    • 2010-09-12
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多