C++ CFileDialog';.exe和.dll中的当前目录不一致
通常,当您使用CFileDialog多次打开文件时,将保留当前目录。即,每次对话框在上一个对话框结束的目录中打开时(如果未取消)。即使您在不同的地方使用不同的CFileDialog实例,这种方法也可以工作 即使在程序重新启动后,也会保留以前的目录 但在我的应用程序中,这似乎不适用于DLL:从main.exe程序调用的CFileDialogs有其当前的dir,而从.DLL调用的CFileDialogs有另一个。他们彼此不互动,但在其他方面表现“正常” 所以我最终得到了两个不一致的当前目录,您必须再次从DLL导航到所需的位置。有时您忘记更改目录,从一个目录加载.exe中的一些数据,从另一个目录加载.dll中的一些其他数据,并得到奇怪的结果 您知道从.exe和.dll打开CFileDialog时使用相同当前目录的方法吗 澄清:我不希望对话框总是从同一个目录开始,我希望它们保留上次使用的目录,但在.exe和.dll中保持一致 My.exe是在VS2003中创建的,在VS2010中是.dllC++ CFileDialog';.exe和.dll中的当前目录不一致,c++,visual-studio-2010,visual-studio,mfc,cfiledialog,C++,Visual Studio 2010,Visual Studio,Mfc,Cfiledialog,通常,当您使用CFileDialog多次打开文件时,将保留当前目录。即,每次对话框在上一个对话框结束的目录中打开时(如果未取消)。即使您在不同的地方使用不同的CFileDialog实例,这种方法也可以工作 即使在程序重新启动后,也会保留以前的目录 但在我的应用程序中,这似乎不适用于DLL:从main.exe程序调用的CFileDialogs有其当前的dir,而从.DLL调用的CFileDialogs有另一个。他们彼此不互动,但在其他方面表现“正常” 所以我最终得到了两个不一致的当前目录,您必须再
(我最初的猜测是,您需要在DLL中的CFileDialog构造函数中提供主窗口句柄,但这没有帮助。我的下一个猜测是通过GetCurrentDirectory()手动获取当前目录,并将其设置为DLL的CFileDialog的起始位置(然后将当前目录设置为其结束的位置)。但这看起来很难看,我不确定它是否能在从WinXP到Win8的所有操作系统中工作,因为根据MSDN,它们对CFileDialog的默认目录有不同的规则。)您需要设置成员结构的lpstrInitialDir。根据我的经验,使用的默认文件夹在目标操作系统和资源管理器设置之间也会有所不同。您必须使用CFileDialog,如下所示:
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_NOCHANGEDIR, _T( "All Files (*.*)|*.*||" ));
n_NOCHANGEDIR标志指示在打开文件对话框时保留以前的路径。
过滤器只是一个例子。您必须对文件扩展名使用自己的筛选器
如果必须在exe和dll中获得相同的位置,请在两者中使用相同的文件对话框对象。根据MSDN for OPENFILENAME结构,这将导致每次打开对话框时都从WinXP中的同一目录启动。但我想从上次对话框结束时的目录开始。抱歉,我将在静默中澄清这一点。@Steed,重写CFileDialog::OnFileNameOK并调用CFileDialog::GetFolderPath以获取完成CFileDialog时使用的目录。将此值用作lpstrInitialDir作为下一次调用的起始目录。这将需要在eWeen.exe和.dll之间(以及在使用CFileDilog加载/保存不同数据的不同函数之间)建立不必要的连接。这似乎是一个巨大的开销。我希望这只是最后的手段。