GetSaveFileName () не возвращает путь промежуточной области записи CD в XP - PullRequest
1 голос
/ 25 июня 2010

У меня есть функция, где я сохраняю файл в месте, указанном пользователем.Я использую GetSaveFileName (), чтобы показать диалог Сохранить как.Затем я использую путь, который он возвращает, чтобы записать файл в это место.Я заметил, что это не работает, когда пользователь выбирает привод CD-RW на машине с XP.Этот же процесс работает правильно в Vista и Windows 7. Я сделал следующие наблюдения:

  1. Путь, возвращаемый GetSaveFileName (), возвращает путь к временной промежуточной области при выборе корневой папки устройства записи компакт-дисков.(F: в моем случае) в Win7 / Vista.
  2. В XP при выборе корневой папки устройства записи компакт-дисков просто возвращается F: \ в качестве пути.ОДНАКО, если я создаю подпапку с помощью диалогового окна «Сохранить как» и сохраняю файл в этой папке (например, F: \ папка), путь к этой папке будет временным.XP будет правильно перенаправлять во временную папку для F: \.

Таким образом, проблема существует только при сохранении в корневую папку устройства записи компакт-дисков на XP.Как я могу достичь той же функциональности, что и Блокнот в XP, и перенаправить «Сохранить как» во временную папку, чтобы у меня был путь, по которому я могу написать для CreateFile ()?

1 Ответ

2 голосов
/ 25 ноября 2010

Я думаю, тот факт, что вы возвращаете область подготовки CD для некоторых путей, является «побочным продуктом» работы функции IShellFolder::GetDisplayNameOf. Я обнаружил, что для устройств записи компакт-дисков PIDL для файла или папки, в которой only существует в области подготовки, преобразуется в строку, ссылающуюся на область подготовки. PIDL для файла или папки, которая существует на компакт-диске (независимо от того, существует ли она также в области подготовки), преобразуется в строку, ссылающуюся на компакт-диск. Поскольку корневая папка (по определению) существует на компакт-диске, это путь к компакт-диску, который вы возвращаете в виде строки.

Я бы предложил разобраться с этим самостоятельно. Вы можете использовать функцию ICDBurn::GetRecorderDriveLetter, чтобы получить букву диска рекордера - тогда тривиально сравнить ее со строкой, которую вы возвращаете из GetSaveFileName(). Если вы вернетесь назад к устройству записи компакт-дисков, вы можете использовать SHGetFolderLocation с CSIDL_CDBURN_AREA, чтобы получить путь к области подготовки - тогда просто нужно заменить букву диска в начале строки пути на путь к месту подготовки.

...