我将应用程序从 VS2008 升级到 VS2015。
我收到一个异常,我认为这是由
触发的/*virtual*/ BOOL CMyAppDoc::SaveModified()
{
if (!IsModified())
return TRUE; // nothing to do
CString str = GetPathName();
SetPathName(str, TRUE); // assign a PathName and add to MRU !
return OnSaveDocument(str);
}
错误框显示:“遇到不正确的参数”。
我进一步调查,错误来自
void CRecentFileList::Add(LPCTSTR lpszPathName, LPCTSTR lpszAppID)
{
..
hr = _AfxSHCreateItemFromParsingName(lpWPath, NULL, IID_IShellItem,LPVOID*)&psi);
ENSURE(SUCCEEDED(hr));
..
}
hr Errorcode 为 2,表示 ERROR_FILE_NOT_FOUND : 系统找不到指定的文件。
解决方法是首先使用 OnSaveDocument(..) 保存文件,然后调用 SetPathName(..)
正确的方法是调用
SetPathName(str, /*bAddToMRU=*/FALSE)
,这样当文件不存在时 CRecentFileList::Add()
就不会遇到 ENSURE(SUCCEEDED(hr))
异常。将此视为“仅提供默认路径”。
不用担心MRU列表没有更新:后续的
OnSaveDocument()
会在文档真正序列化到文件后调用SetPathName(str, TRUE)
。