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 方法

的实现中存在所有这些错误