Сохранил пример на съемный жесткий диск. И запустил этот пример на съемном жестком диске. Пример просто открывает диологовое окно где мы выбираем файл. Жмем ок и программа выходит. Так вот когда я сделал безопасное извлечение съемного жесткого диска. То win 7 написал что устройство занято. Я делаю выключение win 7. Комп гаснет. Я вытаскиваю съемный жесткий диск. И опять загружаю комп. Win 7 загрузилась и я опять вставляю съемный жесткий диск. Он определился я посмотрел папки и сделал безопасное извлечение съемного жесткого диска. Диск может быть извлечен пишет win 7. Я опять подключаю съемный жесткий диск и запускаю свою прогу. И сново при безопасном извлечении съемного жесткого диска выдает win 7 устройство занято. Тоесть я точно опредилил что проблема именно с GetOpenFileName. Потому что убрал ее из своей программы и запустил на съемном жестком диске. И съемный диск после завершения моей программы безопасно извлекся.
Что не так с GetOpenFileName? Может надо Close делать или флаги иные писать? Я больше кошусь на флаги.
Вот какие я флаги пишу OFN_EXPLORER or OFN_LONGNAMES or OFN_OVERWRITEPROMPT
Файл где выбираешь? После диалога выбора файла останется залоченой папка с выбраным файлом.
Файл выбираю на съемном диске. В той же папке где моя прога
Попробуй выбрать на другом диске )
Если я запустил свою прогу с съемного диска. Но выбрал путь на другой винт. То съемный диск извлекаеться безопасно !!!
Так что сделать чтобы при выборе файла на съемном диске , потом можно было съемный диск безопасно извлечь? Может еще раз вызвать GetOpenFileName с указателем на другой винчестер. И сразу закрыть програмно диалог. Вобще можно програмно отменить диалог (типа при выходе из программы само все закроеться)?
SetCurrentDirectory не помогает. GetOpenFileName запоминает последнее место выбора. Как это изменить на нужный мне путь?
ronniko
> Жмем ок и программа выходит.
А ты уверен (по менеджеру задач) что твоё приложение не зависает в памяти после нажатия "ок", т.е. абсолютно корректно завершается ?
Встречал я как-то одну кривую прогу, процесс которой после завершения работы оставался висеть в памяти, приходилось вручную его удалять.
Попробуй так - при запуске приложения сделай GetCurrentDirectory, чтобы запомнить текущую папку процесса, затем
после каждого GetOpenFileName и соответствующих операций ставь её (папку) взад с помощью SetCurrentDirectory.
Hybernaculum прочти пост #6
ronniko
> SetCurrentDirectory не помогает
Обычно этого бывает достаточно, следовательно дело не только в SetCurrentDirectory.
Телепаты как обычно в отпуске, так что кидай сюда весь свой проект, будем смотреть где ты зафейлился.
ronniko
Попробуй флаг OFN_NOCHANGEDIR
Crazy Hamster
> ronniko
> Попробуй флаг OFN_NOCHANGEDIR
"This flag is ineffective for GetOpenFileName."
Пруфлинк
вряд ли баг связан с использованием этой ф-ии, зло затаилось где-то в другом месте кода, например хендл открытого файла не освобожден или что-то в этом духе.
cranky
> вряд ли баг связан с использованием этой ф-ии
Эта функция 100% вызывает вышеописанный баг без принятия соответствующих мер по его устранению.
Но если причина не в этом, то значит
> зло затаилось где-то в другом месте кода
можно выкрутится, вызвав GetOpenFileName для какого нибудь системного файла Виндовс (так как он лежит не в съемном диске - если даже в нем то его извлеь нельзя будет) – после того как не используешь папку.
Тема в архиве.