CFileDialog的当前目录在.exe和.dll中不一致

Posted

技术标签:

【中文标题】CFileDialog的当前目录在.exe和.dll中不一致【英文标题】:CFileDialog's current directory inconsistent in .exe and .dll 【发布时间】:2013-05-08 07:58:50 【问题描述】:

通常,当您使用 CFileDialog 多次打开一个文件时,当前目录会保持不变。即,每次对话框在上一个对话框结束的目录中打开(如果它没有被取消)。即使您在不同的地方使用不同的 CFileDialog 实例,这也有效。

即使在程序重新启动后,之前的目录也会保留。

但在我的应用程序中,这似乎不适用于 DLL:从主 .exe 程序调用的 CFileDialogs 有其当前目录,而来自 .dll 的 CFileDialogs 有另一个。它们不相互交互,但在其他方面表现“正常”。

所以我最终得到了两个不一致的当前目录,你必须再次从 DLL 导航到所需的位置。有时您忘记更改目录,从一个目录加载 .exe 中的一些数据,从另一个目录加载 .dll 中的一些其他数据,并得到奇怪的结果。

你知道从 .exe 和 .dll 打开 CFileDialog 时具有相同当前目录的方法吗?

澄清:我不希望对话框总是从同一个目录开始,我希望它们保留上次使用的目录,但在 .exe 和 .dll 中始终如一地这样做。

我的.exe是在VS2003中创建的,.dll是在VS2010中创建的。

(我最初的猜测是您需要在 DLL 的 CFileDialog 构造函数中提供主窗口句柄,但这没有帮助。我的下一个猜测是通过 GetCurrentDirectory() 手动获取当前目录并将其设置为dll 的 CFileDialog 的起始位置(然后将当前目录设置为它结束的位置)。但这看起来很丑陋,我不确定它是否适用于从 WinXP 到 Win8 的所有操作系统,因为它们对 CFileDialog 的默认目录有不同的规则根据 MSDN。)

【问题讨论】:

【参考方案1】:

您必须使用 CFileDialog,如下所示:

CFileDialog FileDlg( TRUE, NULL, NULL, OFN_NOCHANGEDIR, _T( "All Files (*.*)|*.*||" ));

标志 OFN_NOCHANGEDIR 表示在打开文件对话框时保留以前的路径。 过滤器只是一个例子。您必须对文件扩展名使用自己的过滤器。

如果您必须在 exe 和 dll 中获取相同的位置,请在两者中使用相同的文件对话框对象。

【讨论】:

【参考方案2】:

你需要设置CFileDialog::m_ofn member成员结构的lpstrInitialDir。我的经验是,使用的默认文件夹也会因目标操作系统和资源管理器设置而异。

【讨论】:

根据 MSDN 的 OPENFILENAME 结构,这将导致每次打开对话框时都从 WinXP 中的同一目录开始。但我想从目录开始,最后一个对话框结束时。抱歉,我会在我的提问中澄清这一点。 @Steed,覆盖 CFileDialog::OnFileNameOK 并调用 CFileDialog::GetFolderPath 以获取用于完成 CFileDialog 的目录。将此值用作 lpstrInitialDir 作为下一次调用的起始目录。 这将需要在 .exe 和 .dll 之间(以及使用 CFileDilog 加载/保存不同数据的不同函数之间)建立其他不必要的连接。这似乎是一个巨大的开销。我希望仅将其用作最后的手段。

以上是关于CFileDialog的当前目录在.exe和.dll中不一致的主要内容,如果未能解决你的问题,请参考以下文章

MFC中文件对话框类CFileDialog详解及文件过滤器说明

初始目录不适用于 CFileDialog

使用 CFileDialog 选择文件时的绘画问题

CFileDialog类实现文件夹路径的获取

为啥我用 CFileDialog 获取文件路径后,一些指针不能用了?

如何让CFileDialog同时选择文件和文件夹