¿Hay una solución para el límite de caracteres en el GetOpenFileName función API de Windows () cuando OFN_ALLOWMULTISELECT?

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

Pregunta

De acuerdo con la documentación de MSDN, la función GetOpenFileName ( ) no tiene límite de caracteres con la opción OFN_ALLOWMULTISELECT cuando se compila para Unicode con Windows 2000 y superior. Sin embargo, en Windows XP SP2 x64, estoy encontrando que el límite de 32k ANSI todavía está en vigor, a pesar del uso de Unicode. He visto otras quejas de este problema en la web, pero no hay soluciones. ¿Alguien sabe una solución alternativa simple para esto?

Para ser completa, estoy usando Visual Studio 2010, y la codificación en C ++.

¿Fue útil?

Solución

La documentación puede estar equivocado. GetOpenFileName () está algo obsoleta, y ya no soporta las últimas Vista / Windows 7 características. Lo que es aún peor es que GetOpenFileName () aparece un cuadro de diálogo abierto que se parece a la de Windows 95, al menos cuando se trata de personalizar el diálogo con la característica LPOFNHOOKPROC en Vista o Windows 7.

A partir de la Vista y Windows Server 2008, la nueva API recomendada es la interfaz IFileDialog: http://www.codeproject.com/KB/vista/VGFileDialogs.aspx?msg=2368264 . Desafortunadamente esto no está disponible en XP, por lo tanto, es necesario implementar ambas API en función de la versión del sistema operativo. Si es necesario agregar algunos controles personalizados a su cuadro de diálogo abierto, no tiene otra opción en absoluto, sino utilizar IFileDialogCustomize de todos modos.

Me da cuenta de que su pregunta era con respecto a Windows XP, y mi solución sugerida no le ayudará, pero desafortunadamente IFileDialog es la única alternativa a GetOpenFileName ().

Otros consejos

Es posible que una respuesta tardía, pero yo también tenía que hacer frente a este problema y quería presentar mis soluciones en caso de que otros se encuentran con esto en el futuro (mis condolencias si lo hace). Para aquellos que se pregunta por qué el uso GetOpenFileName legado (), si usted está atascado con el legado de .NET 1.1 y debido a las restricciones (en un mundo real, hay momentos en que la persona o las organizaciones que están pagando a hacer esto lo requiere), que no tienen otras opciones, pero que quedará vinculado a ella, así que por favor deje a un lado las críticas y seguir con la pregunta de OP. Además, una característica agradable (estoy seguro que la gente puede corregirme en esto) es que este método en realidad no abrir el archivo cuando se establece ALLOWMULTISELECT, por lo tanto se puede utilizar como una interfaz para seleccionar varios archivos sin comer los recursos de cada archivos abiertos como corrientes (es decir, imaginar multi-selección de más de 1000 archivos y cada uno tenía un flujo abrió para ella - NOTA: NET de OpenFileDialog también puede hacer esto ya que hay que llamar explícitamente al método OpenFile () para abrir los recursos, por lo tanto iteración los nombres de archivo de propiedad es posible, aunque puede dar. "InvalidOperationException: Demasiados archivos seleccionados" si se excede de los límites de misterio que no tengo ni idea de)

En primer lugar, a pesar de lo https://msdn.microsoft.com/en-us/library/windows/desktop/ms646927%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 dice en las observaciones como

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 

Ya sea que llame explícitamente el "GetOpenFileNameW ()" o dejar que internamente cambiar a ella, hay un límite de 32 KB en Windows XP (como se menciona OP también). Aunque no tengo tiempo para investigar, en Win7 y Server 2012 (64 bits), la misma llamada a la API cambiará correctamente (al parecer) a modo Unicode y no pasa por el límite de 32 KB.

he descubierto que después de leer el artículo de MSDN en https://msdn.microsoft.com/en-us/library/ms996463.aspx?f=255&MSPPError=-2147217396 , Si trampa para WM_NOTIFY CDN_SELCHANGE, consulta a continuación para CDM_GETSPEC con un búfer que es bastante grande (es decir, mayor que 32 KB), puede, de hecho, la lista de archivos de captura / colecciones mayores que el límite de 32 KB. Mis disculpas que la solución descrita en el artículo de MSDN es C # y no C ++, pero el resultado final debe ser el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top