Есть ли обходной путь для ограничения символов в функции API Windows GetOpenFileName () при OFN_ALLOWMULTISELECT? - PullRequest
2 голосов
/ 05 ноября 2010

Согласно документации MSDN, функция GetOpenFileName () не имеет ограничения на число символов с опцией OFN_ALLOWMULTISELECT при компиляции для Unicode с Windows 2000 и выше.Однако в Windows XP x64 SP2 я обнаружил, что ограничение 32 КБ ANSI все еще действует, несмотря на использование Unicode.Я видел другие жалобы на эту проблему в Интернете, но решений нет.Кто-нибудь знает простой обходной путь для этого?

Для завершения я использую Visual Studio 2010 и кодирования на C ++.

Ответы [ 2 ]

4 голосов
/ 05 ноября 2010

Документация может быть неправильной. GetOpenFileName () несколько устарела и больше не поддерживает новейшие функции Vista / Windows 7. Еще хуже то, что GetOpenFileName () открывает диалоговое окно «Открыть», похожее на диалоговое окно в Windows 95, по крайней мере, когда вы пытаетесь настроить диалог с помощью функции LPOFNHOOKPROC в Vista или Windows 7.

Начиная с Vista и Windows Server 2008, новым рекомендуемым API-интерфейсом является интерфейс IFileDialog: http://www.codeproject.com/KB/vista/VGFileDialogs.aspx?msg=2368264. К сожалению, он недоступен в XP, поэтому вам необходимо реализовать оба API-интерфейса в зависимости от версии ОС. Если вам нужно добавить несколько пользовательских элементов управления в диалоговое окно «Открыть», у вас нет другого выбора, кроме как использовать IFileDialogCustomize в любом случае.

Я понимаю, что ваш вопрос касался Windows XP, и мой предложенный обходной путь вам не поможет, но, к сожалению, IFileDialog является единственной альтернативой GetOpenFileName ().

1 голос
/ 19 мая 2015

Возможно, поздний ответ, но мне тоже пришлось столкнуться с этой проблемой и хотел представить свои решения на случай, если другие столкнутся с этим в будущем (мои соболезнования, если вы это сделаете). Для тех, кто задается вопросом, зачем использовать устаревшую функцию GetOpenFileName (), если вы застряли с устаревшей версией .NET 1.1 и из-за ограничений (в реальном мире бывают случаи, когда это требует человек или организации, которые платят вам за это), мы У вас нет другого выбора, кроме как быть связанным с ним, поэтому, пожалуйста, оставьте критику в стороне и придерживайтесь вопроса ОП. Кроме того, одна приятная особенность (я уверен, что люди могут исправить меня в этом) заключается в том, что этот метод на самом деле не открывает файл, когда установлен ALLOWMULTISELECT, таким образом, вы можете использовать его как интерфейс для выбора нескольких файлов без использования ресурсов каждого из них. файлы, открытые как потоки (то есть представьте, что вы выбрали более 1000 файлов, и для каждого из них был открыт поток! - ПРИМЕЧАНИЕ. OpenFileDialog .NET также может сделать это, так как вам нужно явно вызывать метод OpenFile () для открытия ресурсов, таким образом, выполняется итерация Свойство Filenames возможно, хотя оно может выдавать «InvalidOperationException: выбрано слишком много файлов», если вы выходите за пределы тайны, о которой я понятия не имею).

Во-первых, несмотря на то, что https://msdn.microsoft.com/en-us/library/windows/desktop/ms646927%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 говорит в комментариях как

Note, when selecting multiple files, the total character limit for the file names depends on the version of the function.
    • ANSI: 32k limit
    • Unicode: no restriction 

Независимо от того, явно ли вы вызываете «GetOpenFileNameW ()» или позволяете ему внутренне переключаться на него, в Windows XP существует ограничение в 32 КБ (как упоминается и в OP). Хотя у меня нет времени исследовать, на Win7 и Server 2012 (64-разрядная версия) один и тот же вызов API переключится корректно (очевидно) в режим Unicode и обойдет ограничение в 32 КБ.

Я обнаружил, что после прочтения статьи MSDN по https://msdn.microsoft.com/en-us/library/ms996463.aspx?f=255&MSPPError=-2147217396, если я перехватываю WM_NOTIFY для CDN_SELCHANGE, запрашиваю CDM_GETSPEC с довольно большим буфером (т. Е. Больше 32 КБ), вы можете на самом деле захватить список файлов / коллекций, размер которых превышает 32 КБ. Приношу свои извинения за то, что решение, описанное в статье MSDN, это C #, а не C ++, но конечный результат должен быть таким же.

...