GetOpenFileName () с установленным флагом OFN_ALLOWMULTISELECT - PullRequest
5 голосов
/ 18 марта 2009

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

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

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

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

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

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

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

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


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

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

1 Ответ

4 голосов
/ 18 марта 2009

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

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

И все в восхитительном, понятном, не ОО С!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...