2013-05-08 27 views
1

通常,當您使用CFileDialog多次打開一個文件時,會保留當前目錄。也就是說,每次對話框在前一個對話結束的目錄中打開時(如果未取消)。即使你在不同的地方使用不同的CFileDialog實例,這也是有效的。CFileDialog的當前目錄在.exe和.dll中不一致

即使在重新啓動程序之後,仍會保留上一個目錄。

但它看起來像在我的應用程序中,這不適用於跨DLL:從主.exe程序調用的CFileDialogs具有其當前目錄和來自.dll的CFileDialogs有另一個。他們不會互相影響,但其他行爲「正常」。

因此,我最終得到兩個不一致的當前目錄,並且您必須再次從DLL導航到所需的位置。有時你會忘記更改目錄,並且從一個目錄加載一些數據到.exe中的一些數據,以及另一個目錄的.dll中的一些其他數據並得到奇怪的結果。

你知道一個方法,當從.exe和.dll打開CFileDialog時有相同的當前目錄嗎?

說明:我不希望對話始終從相同的目錄開始,我希望它們保留上次使用的目錄,但在.exe和.dll中始終如此。

我的.exe文件是在VS2010中的VS2003,.dll中創建的。 (我最初的猜測是你需要在DLL中的CFileDialog構造函數中提供主窗口句柄,但這沒有幫助。我的下一個猜測是通過GetCurrentDirectory()手動獲取當前目錄並設置它作爲dll的CFileDialog的起始位置(然後設置當前目錄到它結束的位置),但是這看起來相當難看,我不確定它是否適用於從WinXP到Win8的所有操作系統,因爲它們具有不同的默認目錄規則CFileDialog根據MSDN。)

回答

1

您需要設置CFileDialog::m_ofn member成員結構的lpstrInitialDir。我的經驗是,使用的默認文件夾在目標操作系統和資源管理器設置之間也不相同。

+0

根據MSDN的OPENFILENAME結構,每當打開一個對話框時,這將導致從WinXP中的相同目錄開始。但是我想從目錄開始,當最後一次對話結束時。 對不起,我會在靜默中澄清一下。 – Steed 2013-05-08 08:12:00

+0

@Steed,重寫CFileDialog :: OnFileNameOK並調用CFileDialog :: GetFolderPath來獲取完成CFileDialog時使用的目錄。將此值用作lpstrInitialDir作爲下一次調用的起始目錄。 – 2013-05-08 08:25:43

+0

這將需要在.exe和.dll之間進行不必要的連接(以及使用CFileDilog加載/保存不同數據的不同功能之間)。這似乎是一個巨大的開銷。我希望只將這作爲最後的手段。 – Steed 2013-05-08 08:31:34

2

您必須使用CFileDialog的,如下所示:

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

標誌OFN_NOCHANGEDIR表示保留在打開文件對話框以前的路徑。 該過濾器只是一個例子。您必須使用自己的過濾器來擴展文件。

如果您必須在exe和dll中都使用相同的位置,則在兩者中都使用相同的文件對話框對象。