CFileDialog und m_ofn.lpstrFilter



  • Hallo @all,

    ich hätte mal eine Frage zum DateiÖffnen-Dialog (CFileDialog).

    Wenn ich einen Dialog mit beispielsweise "CFileDialog DateiDialog" erstelle und den Parameter

    DateiDialog.m_ofn.lpstrFilter = "ini-Dateien (.ini)\0.ini\0";

    zuweise, funktioniert alles bestens.
    Nun möchte ich aber gerne den ersten Teil des Strings aus der StringTable in einen CString einlesen, das mache ich mit

    CStringName.LoadString(IDS_NAME); // enthält ini-Dateien

    Wenn ich nun folgende Zuweisung mache, funktioniert es nicht mehr und es werden kryptische Zeichen im ÖffnenDialog-Feld angezeigt:

    DateiDialog.m_ofn.lpstrFilter = CStringName + " (.ini)\0.ini\0";

    Womit hängt das zusammen und wie kann ich das Problem lösen? 😕

    DateiDialog.m_ofn.lpstrFilter erwaretet einen LPCSTR.



  • Das könnte damit zusammenhängen, daß C-Strings nullterminiert sind (und auch von Systemfunktionen so behandelt werden). Dadurch schneidet der op+ alles ab dem ersten \0 in deinem String ab (und im Endeffekt hast du auch keinen doppelt nullterminierten String mehr, wie ihn CFileDialog benötigt). Eine Lösung wäre es, den Filter per Hand (memcpy() und co.) zusammenzubauen, alternativ könntest du den String erst zusammensetzen und dann die \0s einzufügen:

    CString Filter = CStringName + " (*.ini)|*.ini|";
    Filter.Replace('|','\0');
    DateiDialog.m_ofn.lpstrFilter = Filter;
    


  • Am Ende des Filters sollten zwei '\0' stehen...



  • Hallo ihr beiden und danke für die schnelle Antwort!

    Ich habe es nach dem Beispiel von CStoll umgesetzt, funktioniert wunderbar. 😉



  • Airdamn schrieb:

    Am Ende des Filters sollten zwei '\0' stehen...

    Tun sie doch 😉 (der zweite \0 wird vom Compiler automatisch an das String-Literal angehängt)



  • CStoll schrieb:

    Airdamn schrieb:

    Am Ende des Filters sollten zwei '\0' stehen...

    Tun sie doch 😉 (der zweite \0 wird vom Compiler automatisch an das String-Literal angehängt)

    Ich hab zu lange zum antworten gebraucht. Hab nicht gesehen, dass Du schon geantwortet hast.
    Das ging also eigentlich an Dressman 😉


Anmelden zum Antworten