CString.GetBuffer(0) => char*
-
Hallo!
Ich muss einem char argv[x]* 2 Werte vom Typ CString zuweisen.
Nun bin ich mir nicht sicher, ob ich das so machen darf:
char* my_argv[1]; CString str; str = ...(irgendeine Zuweisung); my_argv[0] = ""; my_argv[1] = str.GetBuffer(0);
Es funktioniert, egal, wie lang str ist, nur:
Ist es jemandem bekannt, das man so die Länge von str so nicht wissen muß? Oder ist das vielleicht nur Zufall?
Muss ich in jedem Fall noch str.ReleaseBuffer() aufrufen? Auch, wenn ich "0" bei GetBuffer übergeben habe?
Und:
Folgenden Trick habe ich hier im Forum gefunden.
Ist das evtl. besser als die obige Methode? Ich verstehe die Typkonvertierung nicht so ganz.
char* my_argv[1]; CString str; ... my_argv[1] = (LPSTR)(LPCSTR)str;
Schon mal vielen Dank im Voraus,
Sebastian
-
Tag,
Also ich bin mir nicht ganz sicher ob du hier unter der richtigen Topic postest aber char * ist ja auch standart C++ nur CString nicht.
Also das was du da gebastelt hast funktioniert nur so lange du dem CString keinen neuen Wert zu weisst. Wenn du den Inhalt wirklich kopieren willst musst du Speicher anfordern und den Inhalt kopieren. Brauchst du den String nur kurz kannst du es so machen wie du vor geschlagen hast. Du zeigst dann eben auf die Addresse wo der Inhalt liegt. Das macht aber keinen Sinn dann bräuchtest du dein Array nicht.
Also mein Vorschlag 1:char *argv[1]; CString str; argv[0]=new char[str.GetLength()+1]; strcpy(argv[0],str.GetBuffer(0)); //irgendwas machen delete [] (argv[0]);
Vorschlag 2:
string argv[1]; CString str; argv[0]=str.GetBuffer(0);
Die zweite Methode ist die bessere. Du könntest natürlich auch einen Vector von strings nehmen usw. naja so far....
-
Super, Danke!
Andere Meinungen sind halt schon eine Hilfe. Ich schreib Dir einfach mal die Funktion hin, in der ich es brauche (schon geändert):
void MyPerl::Init() { CString strTemp = m_strPerlFileName; //-- Argumenten-Arry definieren: char *my_argv[1]; my_argv[0] = ""; my_argv[1] = strTemp.GetBuffer(0); //-- PerlInterpreter initialisieren: my_perl = perl_alloc(); perl_construct(my_perl); perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL); perl_run(my_perl); }
das char*-"Array" muss ich einer anderen Funktion (perl_parse()) übergeben, die so ein char argv[]* erwartet. Dafür brauch ich es.
So hab ich es nochmal ausprobiert, und es klappt auch.
Nur vielleicht sollte ich trotzdem vorsichtshalber str.ReleaseBuffer() aufrufen? (Werds wohl machen)
Viele Grüße...