2010-02-23 25 views
2

我使用下面的代码来删除文件。它很好。调用SHFileOperation删除文件后奇怪的结果安装后MS Office2003

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); 

但是rcently我发现了一个斯特朗事情,再现步骤如下:1. 安装WIN2000 2.安装MS的office2003

的在第一时间(和仅在第一次)我请“SHFileOperation”功能删除一个文件。然后系统WARNNING消息框显示

“Windows无法在这里创建一个快捷方式。你要放置快捷方式在桌面上呢? ”

不管我选择“OK”或“否”按钮关闭警告消息框。那么这样的警告消息框就不会再显示,即,在关闭警告消息框之后,我可以调用“SHFileOperation”功能来删除没有这种系统警告消息的文件。

这是真正的魔法,它只发生一次。

任何人都知道一些相关的信息?谢谢。

+0

我已删除了MFC的标签,因为这个问题使用普通的Win32 API调用,没有MFC参与。 – Otherside 2010-02-23 09:58:37

+0

我调试我的应用程序,我发现这个奇怪的现象是由我的错误造成的。 在我的应用程序中,分配给FileOp.pFrom(“FileOp.pFrom = szPath;”)的路径名是“C:xxx \ yy \\ zz”,而不是“c:xxx \ yy \ zz”。重复的“\”charchater使这种奇怪的行为引发。然而,我仍然困惑为什么这只是在我安装微软办公室后才发生的,而这只是发生一次。 – Chandler 2010-02-23 14:30:03

回答

3

pFromSHFILEOPSTRUCT的成员是一个以空字符结尾的字符串列表,并且应该以双空字符结尾。它看起来像是szPath是一个以null结束的字符串,只有一个路径。这意味着SHFileOperation将读取超出您预期的pFrom的结尾。

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

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

+0

感谢您的提醒。我已经使用double null,并且除了安装MS Office后的第一次以外,该功能运行良好。 参见 “ THCAR szPath [MAX_PATH]; memset(&szPath,0,sizeof(szPath [0])* MAX_PATH); ” – Chandler 2010-02-23 10:12:22