2010-06-25 40 views
1

我有一個功能,我將文件保存到用戶指定的位置。我正在使用GetSaveFileName()來顯示另存爲對話框。然後,我使用它返回的路徑將文件寫出到該位置。我注意到,當用戶在XP機器上選擇CD-RW驅動器時,它不起作用。這個同樣的過程正常工作在Vista和Windows 7,我提出以下意見:GetSaveFileName()沒有返回CD刻錄臨時區域的路徑XP

  1. )通過則GetSaveFileName(返回的路徑選擇CD刻錄機的根文件夾時,返回臨時分段區的路徑(F:在我的情況下)在Win7/Vista上。
  2. 在XP上,選擇CD刻錄機根文件夾只是返回F:\作爲路徑。但是,如果我使用「另存爲」對話框創建子文件夾並將該文件保存在此文件夾(例如F:\文件夾)中,則路徑是臨時文件夾的路徑。
  3. 在XP中使用其他應用程序(如記事本)將正確重定向到F:\的臨時文件夾。

所以只有當保存到XP上的CD刻錄機的根文件夾時才存在問題。我如何在XP中實現與記事本相同的功能,並將Save As重定向到臨時文件夾,這樣我就可以爲CreateFile()寫入一條路徑了?

+0

你可以發表一個代碼示例,你如何使用'GetSaveFileName',尤其是你在'OPENFILENAME'中使用的Flags。你使用例如'OFN_NOTESTFILECREATE'標誌嗎? – Oleg 2010-06-25 15:15:15

+0

這裏是我正在使用的大概: OPENFILENAME openFileName; ZeroMemory(&openFileName,sizeof(OPENFILENAME)); openFileName.lStructSize = sizeof(OPENFILENAME); openFileName.Flags = OFN_OVERWRITEPROMPT; openFileName.lpstrFilter =「Zip文件(* .zip)」; GetSaveFileName(&openFileName); – Ryand 2010-06-25 16:42:36

回答

2

我認爲你找回某些路徑的CD臨時區域的事實是IShellFolder::GetDisplayNameOf函數工作方式的「副產品」。我發現對於CD刻錄機,文件或文件夾的PIDL只有只有存在於暫存區域中,將轉換爲引用暫存區域的字符串。 CD上存在的文件或文件夾的PIDL(無論它是否存在於臨時區域中)將轉換爲引用該CD的字符串。因爲CD上存在根文件夾(根據定義),所以它是作爲字符串返回的CD路徑。

我會建議你自己處理這個問題。您可以使用ICDBurn::GetRecorderDriveLetter函數獲取刻錄機的驅動器號 - 然後將它與從GetSaveFileName()獲取的字符串進行比較並不重要。如果您確實在CD刻錄機上找回路徑,則可以使用SHGetFolderLocationCSIDL_CDBURN_AREA獲取暫存區域的路徑 - 然後,只需將路徑字符串開頭的驅動器號替換爲臨時路徑區。

+0

謝謝,這似乎是伎倆!在XP系統上運行時,似乎我必須從GetRecorderDriveLetter()自己替換路徑。此功能似乎內置於GetSaveFileName()的Vista/Windows7實現。 – Ryand 2010-11-29 13:57:26