GetSaveFileName() не возвращает путь промежуточной области записи CD в XP

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам