我有一个带有打开文件对话框的简单Delphi程序
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
openDialog : TOpenDialog;
i : Integer;
begin
openDialog := TOpenDialog.Create(self);
openDialog.InitialDir := GetCurrentDir;
if not openDialog.Execute
then ShowMessage('Open file was cancelled')
else
begin
end;
openDialog.Free;
end;
end.
当我单击表单上的按钮并取消文件打开对话框时,这似乎工作正常。
但是,这样做之后,当我让程序运行时 我收到了访问权限。
这可能是XE6中的错误吗?
修改
以防你们中的任何人想知道我的窗户是否是最新的
修改
以下是我收到的错误消息列表:
答案 0 :(得分:2)
我首先在您的转储上运行analyze -v
。不幸的是,令人惊讶的是,没有任何有用的东西。
下一次尝试是使用(~*)
查看所有堆栈。这确实出现在有趣的堆栈之后。
10 TID:1a08 kb kbn kbnL kn knL kpn kPn
# ChildEBP RetAddr
00 0668f128 77c7b230 ntdll!RtlLookupFunctionTable+0x85
01 0668f178 77c7b3f5 ntdll!RtlIsValidHandler+0x26
02 0668f1f8 77c30133 ntdll!RtlDispatchException+0x10e
03 0668f1f8 0668f7b1 ntdll!KiUserExceptionDispatcher+0xf
WARNING: Frame IP not in any known module. Following frames may be wrong.
04 0668f6c0 77c7b499 0x668f7b1
05 0668f6e4 77c7b46b ntdll!ExecuteHandler2+0x26
06 0668f708 77c7b40e ntdll!ExecuteHandler+0x24
07 0668f794 77c30133 ntdll!RtlDispatchException+0x127
08 0668f794 7632c99e ntdll!KiUserExceptionDispatcher+0xf
09 0668fc84 76335d00 ole32!CStdMarshal::Disconnect+0x223
0a 0668fc98 76335ce1 ole32!DisconnectSwitch+0x16
0b 0668fcb0 76335d3f ole32!CStdMarshal::DisconnectAndRelease+0x44
0c 0668fe60 76368f82 ole32!COIDTable::ThreadCleanup+0xcb
0d 0668fea4 76368ec3 ole32!FinishShutdown+0x9d
0e 0668fec4 7635bac3 ole32!ApartmentUninitialize+0x96
0f 0668fedc 763688e8 ole32!wCoUninitialize+0x153
10 0668fef8 6ef2314a ole32!CoUninitialize+0x72
11 0668ff00 764943c0 NetworkItemFactory!FDBackgroundThreadHandler+0x21
12 0668ff88 7662338a shlwapi!WrapperThreadProc+0x1b5
13 0668ff94 77c59f72 kernel32!BaseThreadInitThunk+0xe
14 0668ffd4 77c59f45 ntdll!__RtlUserThreadStart+0x70
15 0668ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
至少,这证实了我们首先怀疑它与COM /系统有关,而不是Delphi。进入堆栈寻找有用的字符串出现在字符串
之后d:\w7rtm\com\ole32\com\class\compobj.cxx
现在我们有了新的搜索内容:w7rtm compobj
这导致SO 上的以下主题(注意相同的堆栈跟踪)
Crashes in ole32!COIDTable::ThreadCleanup … NetworkItemFactory!FDBackgroundThreadHandler
问题由Thomas W提出并由Hans Pasant发表评论,并且使用WinDbg或Windows Internals更难以了解这两个问题而没有找到明确的解决方案(至少,有' s没有解决方案)所以我害怕你留下汉斯给托马斯的以下建议
你被埋在COM管道内,清楚地暗示它 内部状态已损坏。一些是环境问题 一种DLL被注入到进程中并搞砸了。 在崩溃发生之前很久,你就没那么希望了 用调试器诊断它。找到问题的常见来源 来自模块列表。怀疑任何shell扩展,反恶意软件,任何 实用程序类似于Dropbox。使用SysInternals' AutoRun要禁用 他们。 (Hans Pasant)
假设故障是在你的进程中注入了一个dll,我已经从你的转储和运行在我的计算机上的应用程序中截取了加载的dll的横截面(它没有#t;在我的电脑上崩溃了留下了可疑的dll&#39>
ATL90 EhStorAPI EhStorShell FWPUCLNT GROOVEEX_64a40000 GrooveIntlResource_63d20000 MsftEdit OFFICE RpcRtRemote TortoiseSVN32 TortoiseStub32
WMASF WMVCore WSHTCPIP WcnApi Wldap32 atl atl100 audiodev cfgmgr32 crypt32 cryptsp
davhlpr devobj dnsapi dui70 duser fdWNet fundisc gdiplus gdiplus ieframe ieproxy
iertutil imm32 intl3_tsvn32 kernel32 libapr_tsvn32 libaprutil_tsvn32 libsasl32 libsvn_tsvn32 linkinfo lpk mpr
msasn1 msctf msls31 msvcp100 msvcp110 msvcp90 msvcr100 msvcr110 msvcr90 msxml6 netmsg
normaliz nsi ntmarta psapi rpcrt4 secur32 setupapi shdocvw shlwapi slc sspicli
userenv usp10 wininet winmm winnsi winsta wintrust wpdshext wpdshext ws2_32 wship6 xmllite
api_ms_win_downlevel_advapi32_l1_1_0
api_ms_win_downlevel_normaliz_l1_1_0
api_ms_win_downlevel_shell32_l1_1_0
api_ms_win_downlevel_shlwapi_l1_1_0
api_ms_win_downlevel_shlwapi_l2_1_0
api_ms_win_downlevel_user32_l1_1_0
api_ms_win_downlevel_version_l1_1_0
如果我们遗漏所有的Microsoft和Unloaded dll,那么dll仍然存在
TortoiseSVN32
TortoiseStub32
intl3_tsvn32
libapr_tsvn32
libaprutil_tsvn32
libsasl32
libsvn_tsvn32
所以我对你的系统的第一次尝试是卸载或禁用(使用autoruns) TortoiseSVN插件的加载,看看是否能解决你的问题。
答案 1 :(得分:2)
你有一个"第一次机会异常"在ole32.dll中。程序在调试器外部运行时没有出现任何错误(如注释中所述)表明了这一点。当它引用看似伪地址时总是怀疑第一次机会异常,如本例中的0xFEEEFEEE。不要长时间怀疑,检查"事件日志"在IDE的调试窗口中,您应该看到类似"第一次机会异常的条目......" 。
第一次机会异常意味着代码遇到了异常情况。它并不意味着不会处理异常。这就像你自己在代码中引发的异常一样。对于首次出现异常的外部调试器。
这里无所事事或担心。只要程序在此之后正常进行,您就不必尝试避免使用变通办法或任何异常。