Kommandozeilenbefehl aus mehreren Strings zusammenfügen



  • DStefan schrieb:

    Um von einem const char * auf einen char * zu kommen, brauchst du const_cast<char *> nicht static_cast<char *> !

    const_cast zur Umgehung von Compilerfehlern einzusetzen halte ich für sehr gefährlich. Seid ihr sicher, dass die Funktion nichts ändert? Auf MSDN ist der Parameter als Output-Parameter gekennzeichnet.



  • Nexus schrieb:

    DStefan schrieb:

    Um von einem const char * auf einen char * zu kommen, brauchst du const_cast<char *> nicht static_cast<char *> !

    const_cast zur Umgehung von Compilerfehlern einzusetzen halte ich für sehr gefährlich. Seid ihr sicher, dass die Funktion nichts ändert? Auf MSDN ist der Parameter als Output-Parameter gekennzeichnet.

    Du hast Recht, das sollte man nicht machen. Manchmal sind meine Tipps einfach zu hektisch 😉

    Stefan.



  • const_cast zur Umgehung von Compilerfehlern einzusetzen halte ich für sehr gefährlich. Seid ihr sicher, dass die Funktion nichts ändert? Auf MSDN ist der Parameter als Output-Parameter gekennzeichnet.

    Schade, es hat auf jeden Fall funktioniert. Aber dann zur Alternativlösung:

    Fordere stattdessen ein dynamisches Array mit genügend Speicher an, kopiere den Inhalt von c_str() und übergib den Zeiger auf das Array. Die C++-Variante wäre std::vector<char> und als Zeiger auf den C-String &vec[0].

    Dazu eine Frage; ich erhalte also ein const char*, wenn ich .c_str() verwende, wie bekomme ich es dann in ein char konvertiert, um es dem Vector hinzuzufügen. Benutze ich am besten push_back für den Kopiervorgang?



  • tomasito schrieb:

    Schade, es hat auf jeden Fall funktioniert.

    Einmal funktioniert heisst nicht, dass es das immer tun wird. Stichwort undefiniertes Verhalten.

    tomasito schrieb:

    Dazu eine Frage; ich erhalte also ein const char*, wenn ich .c_str() verwende, wie bekomme ich es dann in ein char konvertiert, um es dem Vector hinzuzufügen. Benutze ich am besten push_back für den Kopiervorgang?

    Ich würde gleich den Konstruktor verwenden (eventuell solltest du noch etwas mehr Speicher anfordern, falls die Funktion den braucht). Der Konstruktor erstellt seine Elemente aus einer Iterator-Range (in deinem Fall sind das einfache Zeiger). Das könnte so aussehen:

    const char* TmpBuffer = MyString.c_str();
    std::vector<char> Buffer(TmpBuffer, TmpBuffer + MyString.size());
    
    CreateProcess(..., &Buffer[0], ...);
    


  • Nexus schrieb:

    Ich würde gleich den Konstruktor verwenden (eventuell solltest du noch etwas mehr Speicher anfordern, falls die Funktion den braucht). Der Konstruktor erstellt seine Elemente aus einer Iterator-Range (in deinem Fall sind das einfache Zeiger). Das könnte so aussehen:

    const char* TmpBuffer = MyString.c_str();
    std::vector<char> Buffer(TmpBuffer, TmpBuffer + MyString.size());
    
    CreateProcess(..., &Buffer[0], ...);
    

    Das ginge auch mit MyString.begin() und MyString.end(). In beiden Fällen ist der String in Buffer aber nicht nullterminiert. Also entweder:

    const char* TmpBuffer = MyString.c_str();
    std::vector<char> Buffer(TmpBuffer, TmpBuffer + MyString.size());
    Buffer.push_back(0);
    
    CreateProcess(..., &Buffer[0], ...);
    

    Oder:

    std::vector<char> Buffer(MyString.size() + 1);
    std::strcpy(&Buffer[0], MyString.c_str());
    
    CreateProcess(..., &Buffer[0], ...);
    

    Stefan.



  • Stimmt, vielen Dank für die Ergänzung! 🙂



  • Sorry, für meinen falschen cast, wollte eigentlich erst einfach (char 😉 schreiben, aber dachte, ok, wir sind ja im C++ Forum. Klar muß dann dort ein const_cast hin.

    Laut MSDN ist nur für die WideChar-Version CreateProcessW der 2. Parameter als Output deklariert, und nicht für CreateProcessA.



  • Da ich an einem anderen Projekt getüfftelt habe, kommt meine Antwort etwas verspätet, wollte aber den Beitrag noch sauber beenden.

    const char* TmpBuffer = MyString.c_str();
    std::vector<char> Buffer(TmpBuffer, TmpBuffer + MyString.size());

    CreateProcess(..., &Buffer[0], ...);

    Ich habe letztendlich den Tip von Nexus implementiert und das Programm läuft einwandfrei.

    Ich danke euch alle für die Hilfe und die Erklärungen!

    tom



  • Aber du hast die Nullterminierung (siehe Bemerkung von DStefan) noch eingebaut? 🙂



  • Nexus schrieb:

    Aber du hast die Nullterminierung (siehe Bemerkung von DStefan) noch eingebaut? 🙂

    Ja, habe die Nullterminierung dran gehangen, habe mich nur auf dich bezogen, da die eigentliche Idee von dir kam.

    Trotzdem danke für das kritische Nachfragen, hätte mir auch durchgegangen sein können.


Anmelden zum Antworten