XE6中的TOpenFileDialog访问冲突

时间:2015-02-26 05:01:41

标签: delphi crash windbg windows-7-x64 access-violation

我有一个带有打开文件对话框的简单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.

当我单击表单上的按钮并取消文件打开对话框时,这似乎工作正常。

但是,这样做之后,当我让程序运行时 我收到了访问权限。

access violation

stack trace

这可能是XE6中的错误吗?


修改

以防你们中的任何人想知道我的窗户是否是最新的

update


修改

以下是我收到的错误消息列表:

First

Second

Third

Fourth

2 个答案:

答案 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的调试窗口中,您应该看到类似"第一次机会异常的条目......"

第一次机会异常意味着代码遇到了异常情况。它并不意味着不会处理异常。这就像你自己在代码中引发的异常一样。对于首次出现异常的外部调试器。

这里无所事事或担心。只要程序在此之后正常进行,您就不必尝试避免使用变通办法或任何异常。