我有Delphi XE3,Windows 7 Pro 64bit。 我的应用程序在我的电脑上工作正常但是我的用户告诉我应用程序在Win XP上启动时崩溃,并且在他们的Win 7上也是(!!)。
我试图在我的Win 7上运行该应用程序,但以普通用户身份登录(无管理员) - 它可以运行。 所以现在我已经安装了带有Windows XP的虚拟机,并且在启动时真的会崩溃。
我需要找到可能存在的问题,但我很无奈。
据我无法使用调试器(我没有安装该虚拟机上的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
中的第一行甚至没有执行....
我不知道......有人吗?
不知道这是否重要:我在uses
下的interface
条款中以及implementation
下都有一些单位。我应该看看吗?但是在我的主要形式OnCreate
之前发生了什么?
答案 0 :(得分:1)
最后我明白了!
PRINT DIALOG
组件(TPrintDialog)COPIES = 1
(或大于默认值零)应用程序在启动时崩溃,在细节中你只会看到一些kernel32.dll地址...
我没有在没有打印机的Win 7上测试它。我周围没有这样的系统......
答案 1 :(得分:0)
这是另一种在虚拟机上没有Delphi的情况下跟踪此问题的方法......
从XP启动您的应用程序,看它是否崩溃。
如果它崩溃了......那么请查看从主窗体中拖入的单元...开始删除它们直到程序停止崩溃。
如果它没有崩溃...开始将单位/表格添加回项目源,直到它崩溃。
您是否安装了JCL / JVCL(JEDI)?
如果是这样的话,创建一个Logger ...注意在MainForm代码执行之前需要创建和挂钩Logger ...你还需要从Unhandled Exceptions设置详细的Stack Trace, 在Delphi中选择 - >项目/选项/链接器/映射文件/详细}
您需要在记录器单元中使用这样的东西
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;