SHFileOperation:删除文件时随机引发异常

cyd*_*dan 5 c winapi shfileoperation

我正在使用SHFileOperation()从特定路径中删除目录.它是在多个线程中完成的,删除的目录总是不同的.

它会不时抛出异常:

在del.exe中0x00007FF8AF5D9D2A(ntdll.dll)抛出异常:0xC0000008:指定了无效句柄

还有这个:

在del.exe中0x00007FF8ACC90A36(shell32.dll)抛出异常:0xC0000005:访问冲突读取位置0x0000000000000001.

模块:

shell32.dll 00007FF8ACBD0000-00007FF8AE0D8000 
ntdll.dll   00007FF8AF530000-00007FF8AF701000
Run Code Online (Sandbox Code Playgroud)

这是代码:

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);
Run Code Online (Sandbox Code Playgroud)

pwstrPath最后有一个双空终止符.

这些例外的原因是什么?

编辑

堆栈跟踪:

在此输入图像描述

RbM*_*bMm 3

从堆栈跟踪(即使没有pdb 符号- 有了它会更好)可见,异常不在 Windows shell 本身内部,而是在第三方产品中 - dragext64.dll(这不是本机 Windows 图像)它是实现复制挂钩处理程序- 我建议卸载它或通过注册表项禁用

HKEY_CLASSES_ROOT
   Directory
      shellex
         CopyHookHandlers
            MyCopyHandler
               (Default) = {MyCopyHandler CLSID GUID}
Run Code Online (Sandbox Code Playgroud)

并在此之后进行测试。认为例外必须消失。


看起来其他一些 shell 扩展也有错误 - 在 google 中搜索SHELL32_CallFileCopyHooks。例如错误 TortoiseGit.dll- 请注意堆栈跟踪中的此处shell32.dll!SHELL32_CallFileCopyHooks()

所以ICopyHook::CopyCallback方法的实现中存在所有这些错误