Как определить, что файл диалога был создан с помощью GetOpenFileName? - PullRequest
1 голос
/ 02 сентября 2011

Я принимаю участие в разработке расширения оболочки пространства имен ( 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?

1 Ответ

0 голосов
/ 11 февраля 2017

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

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

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

...