Y at-il une solution de contournement pour la limite de caractères sur la fonction API Windows GetOpenFileName () lorsque OFN_ALLOWMULTISELECT?

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

Question

Selon la documentation MSDN, la fonction GetOpenFileName ( ) n'a pas de limite de caractère avec option OFN_ALLOWMULTISELECT lorsqu'il est compilé pour Unicode avec Windows 2000 et plus. Cependant, sous Windows XP SP2 x64, je trouve que la limite 32k ANSI est toujours en vigueur, malgré l'utilisation d'Unicode. Je l'ai vu d'autres plaintes de ce problème sur le web, mais pas de solution. Quelqu'un sait-il un travail autour simple pour cela?

Pour être complet, j'utilise Visual Studio 2010, et le codage en C ++.

Était-ce utile?

La solution

La documentation peut-être tort. GetOpenFileName () est un peu dépréciée, et il ne prend plus en charge les dernières Vista / Windows 7 fonctionnalités. Ce qui est encore pire est que GetOpenFileName () apparaît une boîte de dialogue Ouvrir qui ressemble à celui de Windows 95, au moins lorsque vous essayez de personnaliser la boîte de dialogue avec la fonction de LPOFNHOOKPROC sur Vista ou Windows 7.

À partir de Vista et Windows Server 2008, la nouvelle API recommandée est l'interface IFileDialog: http://www.codeproject.com/KB/vista/VGFileDialogs.aspx?msg=2368264 . Malheureusement, ce n'est pas disponible sur XP, donc vous devez implémenter les API en fonction de la version du système d'exploitation. Si vous devez ajouter quelques contrôles personnalisés à votre boîte de dialogue Ouvrir, vous avez pas le choix du tout, mais d'utiliser IFileDialogCustomize de toute façon.

Je me rends compte que votre question portait sur Windows XP, et ma solution proposée ne vous aidera pas, mais malheureusement IFileDialog est la seule alternative à GetOpenFileName ().

Autres conseils

Peut-être une réponse tardive, mais moi aussi je devais traiter cette question et je voulais présenter mes solutions dans d'autres cas rencontrent à l'avenir (mes condoléances si vous le faites). Pour ceux qui se demande pourquoi l'utilisation héritage GetOpenFileName (), si vous êtes coincé avec .NET 1.1 existant et en raison des restrictions (dans un monde réel, il y a des moments où la personne ou les organisations qui vous paie pour faire cela l'exige), nous ont pas d'autre choix que d'être lié à elle, donc s'il vous plaît laisser les critiques de côté et le bâton avec la question de l'OP. En outre, une fonctionnalité intéressante (je suis sûr que les gens peuvent me corriger) est que cette méthode ne s'ouvre pas réellement le fichier lorsque ALLOWMULTISELECT est réglé, donc vous pouvez l'utiliser comme interface pour choisir plusieurs fichiers sans manger les ressources de chaque fichiers ouverts sous forme de flux (par exemple imaginer multi-sélection, plus de 1000 fichiers et chacun avait un flux ouvert pour lui - REMARQUE: OpenFileDialog de .NET peut aussi le faire puisque vous devez appeler explicitement la méthode OpenFile () pour ouvrir les ressources, ainsi itération de la propriété est possible les noms de fichiers, mais il peut donner. « InvalidOperationException: Trop de fichiers sélectionnés » si vous dépassez les limites de mystère que je n'ai pas la moindre idée)

Tout d'abord, malgré ce que https://msdn.microsoft.com/en-us/library/windows/desktop/ms646927%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 dit dans les remarques que

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 

Si vous appelez explicitement la « GetOpenFileNameW () » ou le laisser passer interne, il y a une limite de 32 Ko sur Windows XP (comme OP mentionne aussi). Bien que je n'ai pas le temps d'enquêter sur Win7 et Server 2012 (64 bits), le même appel API passe correctement (apparemment) en mode Unicode et contourne la limite de 32 Ko.

Je l'ai découvert que, après avoir lu l'article MSDN sur

scroll top