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

CFileDialog's current directory inconsistent in .exe and .dll

本文关键字:dll 不一致 exe 当前目录 CFileDialog      更新时间:2023-10-16

通常情况下,当您使用CFileDialog多次打开文件时,将保持当前目录。例如,每次对话框在前一个对话框结束的目录打开时(如果没有取消)。即使你在不同的地方使用不同的CFileDialog实例,它也能工作。

即使重新启动程序,也保持原来的目录。

但它看起来像在我的应用程序这不跨DLL工作:CFileDialogs从主。exe程序调用有他们当前的目录和CFileDialogs从。DLL有另一个。它们不相互作用,但在其他方面表现"正常"。

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

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

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

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

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

您必须使用CFileDialog如下所示:

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

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

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

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