SHFileOperation:删除文件时随机引发异常
SHFileOperation: randomly raises exceptions when deleting files
我正在使用 SHFileOperation() 从特定路径删除目录。它是在多个线程中完成的,删除的目录总是不同的。
时不时抛出异常:
Exception thrown at 0x00007FF8AF5D9D2A (ntdll.dll) in del.exe:
0xC0000008: An invalid handle was specified
还有这个:
Exception thrown at 0x00007FF8ACC90A36 (shell32.dll) in del.exe:
0xC0000005: Access violation reading location 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 的末尾有一个双空终止符。
这些异常的原因可能是什么?
编辑
堆栈跟踪:
从堆栈跟踪(即使没有 pdb 符号 - 有了它会好得多)可见异常不在 windows shell 本身而是在第三方产品 - dragext64.dll
(这不是本机 windows 图像)是实现 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 方法
的实现中存在所有这些错误
我正在使用 SHFileOperation() 从特定路径删除目录。它是在多个线程中完成的,删除的目录总是不同的。
时不时抛出异常:
Exception thrown at 0x00007FF8AF5D9D2A (ntdll.dll) in del.exe: 0xC0000008: An invalid handle was specified
还有这个:
Exception thrown at 0x00007FF8ACC90A36 (shell32.dll) in del.exe: 0xC0000005: Access violation reading location 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 的末尾有一个双空终止符。
这些异常的原因可能是什么?
编辑
堆栈跟踪:
从堆栈跟踪(即使没有 pdb 符号 - 有了它会好得多)可见异常不在 windows shell 本身而是在第三方产品 - dragext64.dll
(这不是本机 windows 图像)是实现 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 方法
的实现中存在所有这些错误