我正在使用SHFileOperation()从特定路径中删除目录。它在多个线程中完成,删除的目录总是不同的。
不时会抛出异常:
在del.exe中的0x00007FF8AF5D9D2A(ntdll.dll)抛出异常: 0xC0000008:指定了无效句柄
和这一个:
del.exe中的0x00007FF8ACC90A36(shell32.dll)抛出异常: 0xC0000005:访问冲突读取位置0x0000000000000001。
模块:
shell32.dll 00007FF8ACBD0000-00007FF8AE0D8000
ntdll.dll 00007FF8AF530000-00007FF8AF701000
这是代码:
SHFILEOPSTRUCTW tFileOptions = { 0 };
/* Initialize the file options structure for the deletion process */
tFileOptions.pFrom = pwstrPath;
tFileOptions.wFunc = FO_DELETE;
tFileOptions.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
/* Execute the deletions with the Shell operation */
iResult = SHFileOperationW(&tFileOptions);
if (0 != iResult)
{
printf("WTF\n");
goto lbl_cleanup;
}
SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW, pwstrPath, NULL);
pwstrPath最后有一个双重空终止符。
这些例外的原因是什么?
修改
堆栈追踪:
答案 0 :(得分:3)
(即使没有 pdb符号 - 它会更好)可见该异常不在Windows shell本身内,而是在第三方产品中 - dragext64.dll
(这不是本机窗口图像)这是实现Copy Hook Handler - 我建议卸载此或通过注册表项禁用
HKEY_CLASSES_ROOT
Directory
shellex
CopyHookHandlers
MyCopyHandler
(Default) = {MyCopyHandler CLSID GUID}
并在此之后进行测试。认为例外必须消失。
也看起来像其他一些shell扩展程序有错误 - 在Google SHELL32_CallFileCopyHooks
中搜索。例如bug TortoiseGit.dll
- 请在堆栈跟踪shell32.dll!SHELL32_CallFileCopyHooks()
所以这些错误都在ICopyHook::CopyCallback方法
的实现中