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

时间:2013-05-08 07:58:51

标签: c++ visual-studio-2010 visual-studio mfc cfiledialog

通常,当您使用CFileDialog多次打开文件时,会保留当前目录。即,每次对话框打开时,前一个对话框结束的目录(如果没有取消)。即使你从不同的地方使用不同的CFileDialog实例,这也行得正常。

即使重新启动程序,也会维护上一个目录。

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

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

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

澄清:我不希望对话框总是从同一个目录开始,我希望它们保留最后使用的目录,但是在.exe和.dll中一致地执行。

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

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

2 个答案:

答案 0 :(得分:2)

您必须使用下面给出的CFileDialog:

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

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

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

答案 1 :(得分:1)

您需要设置CFileDialog::m_ofn member成员结构的lpstrInitialDir。我的经验是,使用的默认文件夹在目标操作系统和资源管理器设置之间也有所不同。