GetOpenFileName () с установленным флагом OFN_ALLOWMULTISELECT

Я пытаюсь использовать общий вызов диалогового окна GetOpenFileName (), чтобы открыть диалоговое окно и позволить пользователю выбрать несколько файлов.

У меня установлен флаг OFN_ALLOWMULTISELECT, а также установлен OFN_EXPLORER, поэтому я получаю поле выбора файла "нового стиля".

Когда я настраиваю свою структуру OPENFILENAME, у меня ofn.lpstrFile указывает на буфер, выделенный для хранения результатов, а ofn.nMaxFile устанавливается равной его длине.

Проблема, с которой я столкнулся, заключается в том, что если пользователь выбирает так много имен файлов, что буфер переполняется, вызов GetOpenFileName возвращает FALSE, а затем CommDlgExtendedError () возвращает FNERR_BUFFERTOOSMALL.

Это нормально для обнаружения ошибок, и я мог бы увеличить размер буфера, чтобы исправить это, но рано или поздно пользователь выберет достаточно имен файлов, чтобы переполнить этот буфер.

Я видел заметку в MSDN, в которой говорится, что если буфер слишком мал, первые два байта буфера lpstrFile будут содержать требуемый размер, но размер, который он возвращает, кажется слишком маленьким (возможно, это правильно, когда OFN_ALLOWMULTISELECT не ' т установить). Кроме того, для этого мне потребуется снова открыть диалоговое окно!

Другая мысль, которая у меня возникла, заключалась в создании процедуры подключения диалогового окна, а затем в определении размера имен файлов, когда я получаю сообщение уведомления CDN_SELCHANGE, и динамически выделяю буфер правильного размера, но, хотя он будет записывать данные в новый буфер, кажется чтобы запомнить исходное значение ofn.nMaxFile.

Кто-нибудь знает правильный способ динамического выделения буфера для хранения результатов вызова GetOpenFile, не заставляя диалоговое окно появляться дважды?


Итак, получается, что статья Мартларка не зря.

Мои 2 ошибки:
1) Я забыл добавить MAX_PATH в размер, который нужно применить в хуке, и
2) Это работает только в версии GetOpenFileName в Юникоде. (Я компилировал с UNICODE, не определенным)


person James Caccese    schedule 18.03.2009    source источник
comment
Я уже давно столкнулся с этой же проблемой ... Я пытаюсь вспомнить, как мы преодолели ее за вас!   -  person RobS    schedule 18.03.2009


Ответы (1)


Интересная проблема. Думаю, вы могли бы просто выделить всю память; так, на всякий случай! Но этот документ предлагает использовать процесс Hook:

http://support.microsoft.com/kb/131462

И все в восхитительно-понятном non OO C!

person Martlark    schedule 18.03.2009
comment
В этой статье предлагается решение, которое почти точно такое же, как и обработчик диалога, который я пробовал. Возможно, мне нужно просмотреть свой код, чтобы убедиться, что я не делаю ничего глупого! - Спасибо за то, что нашел, мой гугл-фу был слаб. - person James Caccese; 18.03.2009
comment
Остерегайтесь ошибки при возврате только одного имени файла, на которое намекают. PS: использовал Live Search - person Martlark; 18.03.2009