5

我正在使用 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 末尾有一个双空终止符。

这些异常的原因是什么?

编辑

堆栈跟踪:

在此处输入图像描述

4

1 回答 1

3

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         CopyHookHandlers
            MyCopyHandler
               (Default) = {MyCopyHandler CLSID GUID}

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


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

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

于 2017-05-17T16:47:06.740 回答