Возможно, поздний ответ, но мне тоже пришлось столкнуться с этой проблемой и хотел представить свои решения на случай, если другие столкнутся с этим в будущем (мои соболезнования, если вы это сделаете). Для тех, кто задается вопросом, зачем использовать устаревшую функцию 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 ++, но конечный результат должен быть таким же.