【发布时间】:2017-10-16 22:44:16
【问题描述】:
我正在使用 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 末尾有一个双空终止符。
这些异常的原因是什么?
编辑
堆栈跟踪:
【问题讨论】:
-
如果你用 symbols 来最小化粘贴堆栈跟踪,那就太好了
-
您的代码有缺陷。我们看不到它。
-
更快的是堆损坏,由您的代码造成。但是没有最小的堆栈跟踪是不可能准确地说出的
-
@Olaf 关于 c++ 标签,你在这里看到不符合 c++ 的东西吗? “goto”在这里很好,因为它干净地退出了函数并清理了所有必要的资源。
-
@cydan - 很难准确地说出这里发生了什么,而不会自己调试崩溃。带有已安装 pdb 符号的堆栈跟踪(没有此跟踪几乎没用)这是强制性的最低要求。
SHFileOperationW是令人难以置信的重型 api - 我在 win10 上查看并在内部创建了这个函数 - 76473 个内部函数调用。是的! 76k 不是指令而是函数!!
标签: c winapi shfileoperation