XE6 中的 TOpenFileDialog 访问冲突

TOpenFileDialog Access violation in XE6

我有一个带有打开文件对话框的简单 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 中的错误吗?


编辑

以防万一你们想知道我的 windows 是否是最新的


编辑

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

我先 运行 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/system 相关,而不是 Delphi。深入堆栈寻找有用的字符串出现在 string

之后
d:\w7rtm\com\ole32\com\class\compobj.cxx

现在我们要搜索一些新内容:w7rtm compobj

这导致了 SO 上的以下线程 (注意 相同的堆栈跟踪
Crashes in ole32!COIDTable::ThreadCleanup … NetworkItemFactory!FDBackgroundThreadHandler

这个问题是由 Thomas W and commented on by Hans Pasant 提出的,两者都更了解使用 WinDbg 或 Windows 内部原理,但没有找到明确的解决方案 (至少,没有发布解决方案) 所以恐怕你只剩下 Hans 给 Thomas 的以下建议

You are buried inside the COM plumbing with a clear hint that its internal state is corrupted. This is an environmental problem, some kind of DLL that gets injected into the process and screws things up. Long before the crash occurs so you'll have very little hope of diagnosing it with a debugger. Find the common source of the problem from the modules list. Suspect any shell extension, anti-malware, any utility similar to Dropbox. Use SysInternals' AutoRuns to disable them. (Hans Pasant)

假设故障出在注入到您的进程中的 dll 中,我从您的转储和我计算机上的应用程序 运行 中截取了加载的 dll 的横截面 (它没有不会在我的电脑上崩溃) 留下可疑的 dll

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    

所以我在您的系统上的第一次尝试是卸载或禁用 [​​=38=](使用自动运行) TortoiseSVN 插件的加载,看看是否能解决您的问题。

您在 ole32.dll 中有一个 "first chance exception"。当程序在调试器之外 运行 时没有收到任何错误(如评论中所述)就表明了这一点。当它引用看似伪地址时,总是怀疑第一次机会异常,比如本例中的 0xFEEEFEEE。不过不要怀疑太久,检查 IDE 的 "event log" 调试 window,你应该会看到类似 "First chance exception at ...." 的条目.

第一次机会异常意味着代码遇到了异常情况。这并不意味着不会处理异常。这就像您自己在代码中提出的异常。对于外部调试器,这是第一次机会异常。

在这里没有什么可做或担心的。只要程序在此之后正常进行,您就不必尝试避免出现变通方法或任何异常。