我使用以下代码删除文件。它工作得很好。

SHFILEOPSTRUCT FileOp;
ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT));
FileOp.hwnd = m_hAppHandle;
FileOp.wFunc = FO_DELETE; //delete
FileOp.pFrom = szPath;
FileOp.pTo = NULL;
FileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI;
FileOp.fAnyOperationsAborted = FALSE;
FileOp.hNameMappings = NULL;
FileOp.lpszProgressTitle = NULL;

SHFileOperation(&FileOp);

但是最近我发现了一个很奇怪的东西,再现步骤如下:
1.安装win2000
2.安装MS office2003

第一次(也是第一次),我调用“SHFileOperation”函数删除文件。然后显示系统警告消息框

“Windows无法在此处创建快捷方式。您要将快捷方式放置在桌面上吗?


无论我选择“确定”还是“否”按钮来关闭警告消息框。那么,该警告消息框将不再显示,即,在关闭警告消息框后,我可以调用“SHFileOperation”函数删除没有此类系统警告消息的文件。

这确实是魔术,它只会发生一次。

有人知道一些相关信息吗?谢谢。

最佳答案

pFromSHFILEOPSTRUCT成员是一个以null结尾的字符串的列表,并应以double null结尾。看来szPath是一个以null终止的单个字符串,其中只有一个路径。这意味着SHFileOperation的读取范围将超出pFrom的预期范围。

MSDN库的SHFILEOPSTRUCT:http://msdn.microsoft.com/en-us/library/bb759795%28VS.85%29.aspx

关于此的博客文章:Don't forget to double-null-terminate those strings you pass to SHFileOperation

关于c++ - 安装MS office2003后调用SHFileOperation删除文件时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2317009/

10-10 09:47