Как определить, что диалог с файлом был создан с помощью GetOpenFileName?

Я принимаю участие в разработке расширения оболочки пространства имен (NSE), содержащий список файлов из некоторых папок. У меня есть проблемы с диалоговым окном открытия файла (OFD), созданным с флагом OFN_ALLOWMULTISELECT в Windows Vista.

Если приложение использует OFD, созданное с помощью IFileOpenDialog, мой NSE работает нормально. Если приложение использует OFD, созданное с помощью GetOpenFileName, и пользователь выбирает несколько файлов, он получает неверный результат, потому что эта функция возвращает строку:

<Folder name>\0<File name 1>\0<File name2>\0\0

Я должен использовать режим одиночного выбора в моем NSE, если приложение использует OFD, созданное с использованием GetOpenFileName.

Вопрос в том:

Есть ли способ определить в моем NSE, что OFD было создано с использованием GetOpenFileName?


person goshavt    schedule 02.09.2011    source источник
comment
Вы не можете этого обнаружить. Похоже, вы хотите изменить поведение диалогового окна файла, а не исправлять ошибки в вашем NSE. Люди пишут программное обеспечение с использованием диалоговых окон с множественным выбором файлов, потому что они, э-э, хотят выбрать несколько файлов. Попытка заблокировать это исключительно враждебна пользователю.   -  person David Heffernan    schedule 02.09.2011
comment
Я тестировал OFD, созданный с помощью GetOpenFileName, в результатах поиска NSE и Windows и обнаружил те же ошибки. Я думаю, мой NSE возвращает правильные данные, но GetOpenFileName не может их обработать и не может поместить правильные имена файлов (с подпапками) в строку результата. Я не хочу изменять поведение OFD, но если он возвращает неправильные имена файлов, пользователь получит сообщение об ошибке Файл не найден. Могу ли я использовать следующий способ: попробуйте получить IFileOpenDialog из IShellBrowser, и если эта попытка прошла успешно, то OFD был создан с использованием IFileOpenDialog, в противном случае - с помощью GetOpenFileName. Но я не уверен, что это возможно.   -  person goshavt    schedule 02.09.2011
comment
Это не неправильный результат, это то, как окна OFD разграничивают несколько выбранных файлов.   -  person AJG85    schedule 02.09.2011
comment
Должен быть следующий результат: ‹Имя папки› \ 0 ‹Имя файла 1› \ 0 ‹Подпапка 1 \ Имя файла2› \ 0 ‹Имя папки› \ 0 ‹Подпапка 2 \ Имя файла 3› \ 0 \ 0. OFD, созданный с помощью IFileOpenDialog, возвращает правильный результат в IShellItemArray   -  person goshavt    schedule 02.09.2011


Ответы (1)


Старый диалог GetOpenFileName никогда не предназначался для обработки нескольких файлов в разных родительских папках.

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

Когда вызывается ваш метод IShellFolder :: EnumObjects, ищите флаг SHCONTF_FLATLIST. Если флаг не установлен, вам следует вернуться в какой-либо простой режим, в котором все элементы имеют одного и того же родителя. Я понимаю, что это не совсем то, для чего предназначен флаг, но это, вероятно, лучшее не-хакерское решение.

person Anders    schedule 11.02.2017