Diese Zeile:
%Vor%sollte die Wide-Char-Version von printf verwenden.
%Vor%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:
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.
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!
Tags und Links c++ winapi savefiledialog