const String?



  • WurzelD schrieb:

    Ok. Dann muß ich es anders machen. Danke

    Ist aber kein Problem:

    char* buffer = new char[str.length() + 1];
    std::copy(str.begin(), str.end(), buffer);
    // Übergabe an WinAPI ...
    delete [] buffer;
    

    PS, aus Interesse: Was verwendest Du für einen Browser bzw. was für eine komische Textcodierung benutzt der? Bei Deinen Texten sind die Umlaute verhauen.



  • WurzelD schrieb:

    Ok. Dann muß ich es anders machen. Danke

    Hi,

    als Standardweg kannst Du einfach eine Kopie anlegen:

    void StartProcess(string const& sExePath) {
       char* tmp = new char[sExePath.length()+1]; // für exceptionsafety noch smart_ptr/auto_ptr/... (spare ich mir wg. Übersichtlickeit)
       copy(sExePath.begin(), sExePath.end(), tmp);
       result = CreateProcess( 0, tmp, 0, 0, FALSE, 0, 0, 0, &si, &pi);
       delete[] tmp;
    }
    

    Für "ändernde Funktionen", kannst Du vor dem delete[] noch die Daten wieder zurückkopieren.

    EDIT: Ähhh - ich hätte vor dem Meeting doch noch abschicken sollen. Aber schön, dass Konrad meiner Version offensichtlich bestätigt.

    Gruß,

    Simon2.



  • Meine Loesung:

    string sExePathChangeable = sExePath;
    result = CreateProcessA(0, const_cast<char *>(sExePathChangeable.c_str()), 0, 0, FALSE, 0, 0, 0, &si, &pi);
    

    Die Kopie sollte ja beschreibbar sein.

    @Simon2: Sehe ich da einen alten C Cast *g*

    @Konrad: Ich schreibe über einen Proxy (www.proxy.org). Dieser scheint die Umlaute zu verfaelschen.
    Ich kenn Dich sogar noch aus dem ActiveVB Forum. Wie klein die Welt doch ist 😉



  • WurzelD schrieb:

    string sExePathChangeable = sExePath;
    result = CreateProcessA(0, const_cast<char *>(sExePathChangeable.c_str()), 0, 0, FALSE, 0, 0, 0, &si, &pi);
    

    Die Kopie sollte ja beschreibbar sein.

    Hmm. Man kann zwar wahrscheinlich davon ausgehen aber hier verlässt Du Dich auch Kenntnisse über die Interna der Stringklasse. Das finde ich tendenziell nicht so schön. Im Prinzip ist dieser const-cast ja ein Hack.

    @Konrad: Ich kenn Dich sogar noch aus dem ActiveVB Forum. Wie klein die Welt doch ist 😉

    Oh. In der Tat.



  • WurzelD schrieb:

    ...
    @Simon2: Sehe ich da einen alten C Cast *g*...

    Du siehst da den Originalcode des OPs, weil das nicht Teil meiner Aufgabe war.. 😃

    Außerdem: Wer einen const_cast anbietet, sollte nicht mit Steinen werfen ... 😉
    zumal mein C-Cast schlimmstenfalls überflüssig aber durchaus sicher war (jedenfalls so, wie ich ihn gemeint habe - Copy&Paste-Fehler mal außen vor gelassen), während Dein const_cast eine gefährliche Sache ist.

    Gruß,

    Simon2.



  • So ein Mist! Ich muss mich auch noch auf die neuen Casts umstellen 😉

    Ich habe den DirtyHack entfernt. Allerdings hat bei Euch noch die terminierende 0 gefehlt:
    cBuffer[sExePath.length()] = '\0';



  • WurzelD schrieb:

    So ein Mist! Ich muss mich auch noch auf die neuen Casts umstellen 😉

    Ich habe den DirtyHack entfernt. Allerdings hat bei Euch noch die terminierende 0 gefehlt:
    cBuffer[sExePath.length()] = '\0';

    Nicht, wenn new[] die Standardinitialisierung vornimmt ... (und auf Plattformen, in denen 0 == '\0' ist).

    Gruß,

    Simon2.



  • Wenn ich mit der Maus nach Ausfuehrung dieser Zeile ueber den Buffer gehe steht da jede Menge Mist drin und nicht 0:
    char* tmp = new char[sExePath.length()+1];

    Und wenn man sich diesen Link ansieht:
    http://www.math.uni-bayreuth.de/~rbaier/lectures/c++_ss2001/html/node156.html

    Wird bei Standardtypen auch nicht intitialisiert.



  • WurzelD schrieb:

    Wenn ich mit der Maus nach Ausfuehrung dieser Zeile ueber den Buffer gehe steht da jede Menge Mist drin und nicht 0:
    ...
    Wird bei Standardtypen auch nicht intitialisiert.

    Tja, da war ich mir nicht ganz sicher (ist auch nicht einfach festzustellen) und bei meinem Compiler ist das anders (da sind 0en drin). Ich hatte in meiner ursprünglichen Version auch die Zeile drin und erst später rausgemacht (weil - wie ich dachte - überflüssig).....

    OK, nur noch 2:1 für mich 😉

    Gruß,

    Simon2.



  • Simon2 schrieb:

    OK, nur noch 2:1 fuer mich 😉

    So gross ist das Forum ja nicht... see you again! *g*



  • WurzelD schrieb:

    Simon2 schrieb:

    OK, nur noch 2:1 fuer mich 😉

    So gross ist das Forum ja nicht... see you again! *g*

    Ach was - ich lass mich auszahlen .... so einen Glückstreffer bekomme ich hier nicht so schnell wieder *schnell-abmeld* 😃

    Gruß,

    Simon2.


Anmelden zum Antworten