-1

我有 Delphi XE3,Windows 7 Pro 64 位。我的应用程序在我的 PC 上运行良好,但我的用户告诉我应用程序在他们的 Win XP 上启动时崩溃,在他们的 Win 7 上也(!!)。

我试图在我的 Win 7 上运行该应用程序,但以普通用户(没有管理员)身份登录 - 它可以工作。所以现在我已经用 Windows XP 安装了虚拟机,并且真的 - 应用程序在启动时崩溃了。

我需要找出可能是什么问题,但我无能为力。

至于我不能使用调试器(我没有在那个VM上安装Delphi),我试图MessageBox(0, 'Hello', 'Test', MB_OK);在我的应用程序的各个地方放置一些来捕捉它发生的地方,这就是我发现的:

我的项目源中有这个:

MessageBox(0, 'Hello', 'Test', MB_OK); // shows OK
Application.CreateForm(TfMain, fMain);
MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line

这是OnCreate我的主要形式的功能,称为fMain

procedure TfMain.FormCreate(Sender: TObject);
begin
  MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line
  ...

那么这个应用程序会在哪里崩溃呢?
甚至没有OnCreate执行的第一行......
我不知道......有人吗?

不知道这是否重要:我在 fMainuses子句下interface和下都有一些单位implementation。我应该看那里吗?OnCreate但是在我的主要形式之前会发生什么?

4

2 回答 2

1

最后我得到了它 !

  • 在表单上放置PRINT DIALOG组件(TPrintDialog)
  • 在设计时在对象检查器中设置COPIES = 1(或大于默认零)
  • 尝试在未安装打印机的 WinXP 上运行此类应用程序

应用程序只是在启动时崩溃,在细节中你只会看到一些 kernel32.dll 地址......

我没有在没有打印机的 Win 7 上测试它。我身边没有这样的系统...

于 2013-08-11T16:02:14.263 回答
0

这是在 VM 上不使用 Delphi 的情况下跟踪此问题的另一种方法......

  • 复制您的项目。
  • 从项目源中删除除主窗体之外的所有单元。
  • 从 XP 启动您的应用程序,看看它是否崩溃。

  • 如果它崩溃...然后查看从主窗体中拖入的单元...开始删除它们,直到您的程序停止崩溃。

  • 如果它没有崩溃...开始将单元/表单添加回您的项目源,直到它崩溃。

您是否安装了 JCL/JVCL(JEDI)?

如果是这样,请创建一个 Logger...请注意,在执行 MainForm 代码之前需要创建并连接 Logger...您还需要在 Delphi select->Project/Options/Linker 中从未处理的异常中设置详细的堆栈跟踪/地图文件/详细}

您的 Logger 单元中将需要这样的东西

procedure HookGlobalException(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
  a_List: TStringList;
begin
  if Assigned(TLogger._Instance) then
  begin
    a_List := TStringList.Create;
    try
      a_List.Add(cStar);
      a_List.Add(Format('{ Exception - %s }', [Exception(ExceptObj).Message]));
      JclLastExceptStackListToStrings(a_List, False, True, True, False);
      a_List.Add(cStar);
  // save the error with stack log to file
      TLogger._Instance.AddError(a_List);
    finally
      a_List.Free;
    end;
  end;
end;


initialization
  Lock := TCriticalSection.Create;
  Include(JclStackTrackingOptions, stTraceAllExceptions);
  Include(JclStackTrackingOptions, stRawMode);

  // Initialize Exception tracking
  JclStartExceptionTracking;

  JclAddExceptNotifier(HookGlobalException, npFirstChain);
  JclHookExceptions;

finalization
  JclUnhookExceptions;
  JclStopExceptionTracking;
  Lock.Free;
于 2013-08-08T22:57:29.050 回答