Gibt es eine Abhilfe für die normale Zeichenbegrenzung auf der Windows-API-Funktion GetOpenFileName (), wenn OFN_ALLOWMULTISELECT?

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

Frage

Nach der MSDN-Dokumentation, die Funktion GetOpenFileName ( ) hat keine Zeichenbegrenzung mit Option OFN_ALLOWMULTISELECT wenn für Unicode mit Windows 2000 und höher zusammengestellt. Allerdings unter Windows XP x64 SP2, ich finde, dass die 32k ANSI Grenze immer noch in Kraft ist, trotz der Verwendung von Unicode. Ich habe andere Beschwerden dieses Problems auf dem Netz gesehen, aber keine Lösungen. Kennt jemand eine einfache Behelfslösung für das?

Um vollständig zu sein, ich bin mit Visual Studio 2010 und Codierung in C ++.

War es hilfreich?

Lösung

Die Dokumentation könnte falsch sein. GetOpenFileName () ist etwas veraltet, und es unterstützt nicht mehr die neuesten Vista / Windows 7 Funktionen. Was noch schlimmer ist, dass GetOpenFileName () erscheint einen Öffnen-Dialog auf, das aussieht wie die in Windows 95, zumindest, wenn Sie versuchen, den Dialog mit der LPOFNHOOKPROC Funktion auf Vista oder Windows 7 anpassen.

Beginnend mit Vista und Windows Server 2008, die neue empfohlene API ist die Schnittstelle IFileDialog: http://www.codeproject.com/KB/vista/VGFileDialogs.aspx?msg=2368264 . Leider ist dies auf XP nicht verfügbar, daher müssen Sie in Abhängigkeit von der Betriebssystem-Version beide APIs implementieren. Wenn Sie ein paar benutzerdefinierten Steuerelemente zu Ihrem Öffnen-Dialog hinzufügen müssen, haben Sie keine Wahl überhaupt aber trotzdem IFileDialogCustomize zu verwenden.

Ich weiß, dass Deine Frage zu Windows XP war, und meine vorgeschlagene Abhilfe wird dir nicht helfen, aber leider ist IFileDialog die einzige Alternative zu GetOpenFileName ().

Andere Tipps

Vielleicht eine späte Antwort, aber ich hatte auch mit diesem Thema zu befassen und wollte meine Lösungen bei anderen präsentieren begegnet dies in der Zukunft (mein Beileid, wenn Sie tun). Für diejenigen, die fragt sich, warum die Verwendung Vermächtnis GetOpenFileName (), wenn Sie mit älteren .NET 1.1 und aufgrund von Beschränkungen feststecken (in einer realen Welt, es gibt Zeiten, in denen die Person oder Organisationen, die Sie zahlen, dies zu tun erfordert), wir keine andere Wahl haben, sondern es gebunden zu sein, so wenden sie sich bitte auf die Kritik beiseite und Stick mit OP Frage verlassen. Auch ein nettes Feature (Ich bin sicher, dass die Leute mich auf diese korrigieren kann) ist, dass diese Methode tatsächlich die Datei nicht öffnen, wenn ALLOWMULTISELECT eingestellt ist, so können Sie es als eine Schnittstelle verwenden, um mehrere Dateien auswählen, ohne die Ressourcen jedes zu Essen Dateien als Streams geöffnet (dh vorstellen Multi-Auswahl 1000 Dateien und jeder hatte ein Strom für sie geöffnet - Hinweis: .NET des Openfile kann dies auch tun, da Sie explizit müssen nennen Openfile () -Methode, um die Ressourcen zu öffnen, damit Iteration Dateinamen Eigenschaft ist möglich, obwohl es geben kann. „InvalidOperationException: zu viele Dateien ausgewählt“, wenn Sie das Geheimnis Grenzen überschreiten habe ich keine Ahnung über)

Zum einen trotz allem, was https://msdn.microsoft.com/en-us/library/windows/desktop/ms646927%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 sagt in den Ausführungen als

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 

Ob Sie die „GetOpenFileNameW ()“ explizit aufrufen oder lassen Sie es, um es intern wechseln, gibt es eine 32-KB-Grenze für Windows XP (als OP auch erwähnt). Obwohl ich nicht die Zeit habe, zu untersuchen, auf Win7 und Server 2012 (64-Bit), wird der gleiche API-Aufruf schalt korrekt (scheinbar) in Unicode-Modus und umgeht die 32KB Grenze.

Ich habe entdeckt, dass nach dem Einschalten der MSDN-Artikel lesen

scroll top