【问题标题】:strange result when calling SHFileOperation to delete file after install MS office2003安装 MS Office 2003 后调用 SHFileOperation 删除文件时出现奇怪的结果
【发布时间】:2011-01-19 23:52:34
【问题描述】:

我使用以下代码删除文件。效果很好。

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”函数来删除一个没有这种系统警告信息的文件。

这真的很神奇,它只会发生一次。

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

【问题讨论】:

  • 我已经删除了 MFC 标签,因为这个问题使用普通的 win32 API 调用,不涉及 MFC。
  • 我调试了我的应用程序,我发现这个奇怪的现象是我的错误造成的。在我的应用程序中,分配给 FileOp.pFrom ("FileOp.pFrom = szPath;" ) 的路径名是 "C:xxx\yy\\zz" ,而不是 "c​​:xxx\yy\zz"。重复的“\”字符使这种奇怪的行为出现。但是,我仍然很困惑为什么在我安装了 MS Office 之后才发生这种情况,而且它只发生过一次。

标签: c++ windows winapi sdk


【解决方案1】:

SHFILEOPSTRUCTpFrom 成员是一个以空字符结尾的字符串列表,应该以双空字符结尾。看起来 szPath 是一个以 null 结尾的字符串,其中只有一个路径。这意味着SHFileOperation 将超出pFrom 的预期结尾。

SHFILEOPSTRUCT 的 MSDN 库: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

【讨论】:

  • 谢谢提醒。我已经使用了 double null 并且该功能运行良好,除了我第一次安装 MS Office 之后。见" THCAR szPath[MAX_PATH]; memset(&szPath, 0, sizeof(szPath[0])*MAX_PATH); "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多