MFC CFileDialog和lpstrInitialDir

MFC CFileDialog和lpstrInitialDir,mfc,cfiledialog,Mfc,Cfiledialog,根据的文档,以下算法用于选择初始目录: Windows 7: 如果lpstrInitialDir的值与应用程序第一次使用打开或另存为对话框时传递的值相同,则用户最近选择的路径将用作初始目录 否则,如果lpstrFile包含路径,则该路径为初始目录 否则,如果lpstrInitialDir不是NULL,则指定初始目录 如果lpstrInitialDir为NULL且当前目录包含任何指定筛选器类型的文件,则初始目录为当前目录 否则,初始目录为当前用户的个人文件目录 否则,初始目录为桌面文件夹 我正在使

根据的文档,以下算法用于选择初始目录:

Windows 7:

  • 如果lpstrInitialDir的值与应用程序第一次使用打开另存为对话框时传递的值相同,则用户最近选择的路径将用作初始目录
  • 否则,如果lpstrFile包含路径,则该路径为初始目录
  • 否则,如果lpstrInitialDir不是NULL,则指定初始目录
  • 如果lpstrInitialDirNULL且当前目录包含任何指定筛选器类型的文件,则初始目录为当前目录
  • 否则,初始目录为当前用户的个人文件目录
  • 否则,初始目录为桌面文件夹
  • 我正在使用以下代码构造一个文件对话框:

    CFileDialog dlgFile(bOpenFileDialog);
    dlgFile.m_ofn.lpstrInitialDir = strSourcePath;
    dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
    
    但是,它总是在strSourcePath中打开相同的默认文件夹。有人知道为什么吗?它应该只在第一次使用这个目录,随后打开的文件应该记住最后一个文件夹(算法中的项目符号1)。我正在Windows 7上使用VS2012。

    以下是修复程序:

    dlgFile.m_ofn.lpstrInitialDir = strSourcePath.GetBuffer(_MAX_PATH);
    
    别忘了调用strSourcePath.ReleaseBuffer()当您完成时


    如果使用
    lpstrFile
    指定文件名,则可能需要在文件名的初始目录路径前加上前缀

    抱歉,忘记添加…strSourcePath是一个CString strSourcePath;strSourcePath=“C:\\Foldername”;这解决不了任何问题
    CString
    具有隐式的
    LPCTSTR
    转换运算符(如问题中所用)
    lpstrInitialDir
    属于
    LPCTSTR
    类型。毫无理由地将指针传递给可修改的字符串是错误的。我不知道,为什么您认为这是一个解决方案。文档似乎有冲突。虽然包含问题中复制的算法,但建议在使用Windows Vista样式对话框时不支持
    lpstrInitialDir