Я пытаюсь использовать вызов общего диалогового окна 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 не определено )