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最后有一个双空终止符.
这些例外的原因是什么?
编辑
堆栈跟踪:
从堆栈跟踪(即使没有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方法的实现中存在所有这些错误