Есть ли обходной путь для лимита символов на функции Windows API GetopenFilename (), когда ofn_allowmultiselect?

StackOverflow https://stackoverflow.com/questions/4107722

Вопрос

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

Чтобы быть завершенным, я использую Visual Studio 2010 и кодируюсь в C ++.

Это было полезно?

Решение

Документация может быть неправильной. 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 ().

Другие советы

Возможно, поздний ответ, но я тоже должен был иметь дело с этим вопросом и хотел представить свои решения, если другие встречаются в будущем (мои соболезнования, если вы делаете). Для тех, кто чудес, зачем использовать устаревшее getopenfilename (), если вы застряли на устаревших .NET 1.1 и из-за ограничений (в реальном мире, есть времена, когда человек или организации, которые платят вам это, требуют этого), мы Нет другого выбора, кроме как быть связанным с ним, поэтому, пожалуйста, оставьте критику в сторону и придерживайтесь вопроса OP. Кроме того, одна хорошая особенность (я уверен, что люди могут исправить меня на этом) состоит в том, что этот метод на самом деле не открывает файл при установке MultiSelect, при этом вы можете использовать его в качестве интерфейса для выбора нескольких файлов без употребления ресурсов каждого Файлы, открытые в виде потоков (т. Е. Представьте себе файлы multi-selection 1000+, и у каждого был открыт поток! - Примечание: openFileDialog .NET также может сделать это, поскольку вы должны явно вызоветь метод OpenFile (), чтобы открыть ресурсы, что итерация Именные имена свойства возможны, хотя он может дать «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 ()» или позвольте ему внутренне переключаться на него, есть лимит 32КБ на Windows XP (как упоминание о упоминании). Хотя я не время расследовать, на 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 ++, но конечный результат должен быть таким же.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top