wie man Datei mit GetSaveFileName in Win32 speichert?

8

Ich schreibe diesen Code, um fileName zum Speichern meiner Datei zu erhalten:

%Vor%

Aber die Ausgabe ist:

%Vor%

warum? Mache ich etwas falsch? Ich verwende Visual Studio 2008 unter Windows 7.

    
hamed 04.05.2012, 13:00
quelle

3 Antworten

8

Diese Zeile:

%Vor%

sollte die Wide-Char-Version von printf verwenden.

%Vor%     
Tony The Lion 04.05.2012, 13:08
quelle
8

Das Wurzelproblem liegt in diesen Zeilen:

%Vor%

Dies erstellt einen Puffer mit MAX_PATH-Zeichen, teilt der Funktion GetSaveFileName jedoch mit, dass es sich um einen Puffer aus MAX_PATH breiten Zeichen handelt. Dies wird wahrscheinlich zum Absturz führen (oder den Speicher stillschweigend zerstören), wenn jemand einen langen Pfadnamen auswählt.

Das Werbegeschenk ist die Besetzung. Belügen Sie den Compiler oder die Bibliotheken nicht. Sie mögen das nicht, und am Ende werden sie sich immer rächen. Ersetzen Sie diese Zeilen durch Folgendes:

%Vor%

Nun wird der ausgewählte Dateiname als eine Zeichenfolge mit breiten Zeichen zurückgegeben. Die Antwort von Tony The Lion ist richtig, dass Sie wprintf anstatt printf verwenden müssen, um Strings mit breiten Zeichen zu drucken:

%Vor%

Wenn Sie die Zeichenfolge in 8-Bit-Zeichen anstelle von breiten Zeichen benötigen, können Sie WideCharToMultiByte verwenden. Aber ich würde einfach bei den breiten Charakter-APIs bleiben.

Bearbeite niemals, es sei denn, du weißt genau, was es tut und warum es in deinem speziellen Fall notwendig ist.

    
Adrian McCarthy 04.05.2012 17:05
quelle
-1

Sie liegen beide falsch, es ist ein einfaches C-Pointer / Stack-Problem.

%Vor%

Dies verwirrt Arrays und Zeiger, Sie deklarieren ein Array auf dem Stack, ändern dann aber die Speicheradresse, um auf eine leere Zeichenfolge im Datenabschnitt zu zeigen. Mit anderen Worten, ein Pufferüberlauf.

%Vor%

Dies deklariert ein Zeichen-Array auf dem Stapel und initialisiert alle Elemente auf Null-Terminator.

Hoffe das hilft!

    
David Chapman 03.03.2015 21:33
quelle

Tags und Links