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

时间:2017-05-17 12:50:02

标签: 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

这是代码:

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最后有一个双重空终止符。

这些例外的原因是什么?

修改

堆栈追踪:

enter image description here

1 个答案:

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

的实现中