CDocument::SetPathName(..) 在 VS2015 中崩溃

问题描述 投票:0回答:2

我将应用程序从 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);           

}

错误框显示:“遇到不正确的参数”。

mfc
2个回答
2
投票

我进一步调查,错误来自

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(..)


0
投票

正确的方法是调用

SetPathName(str, /*bAddToMRU=*/FALSE)
,这样当文件不存在时
CRecentFileList::Add()
就不会遇到
ENSURE(SUCCEEDED(hr))
异常。将此视为“仅提供默认路径”。

不用担心MRU列表没有更新:后续的

OnSaveDocument()
会在文档真正序列化到文件后调用
SetPathName(str, TRUE)

© www.soinside.com 2019 - 2024. All rights reserved.