const String?
-
akari schrieb:
Und beim nachforschen in MSDN kannst du lesen das es ein reiner In-Parameter ist, der Speicherbereich wird nicht verändert.
Du musst eine andere MSDN Library haben als ich:
The system adds a null character to the command line string to separate the file name from the arguments. This divides the original string into two strings for internal processing.
-
Hallo
*grummel* Ja... ich hatte natürlich an lpApplicationName gedacht, nicht an lpCommandLine. Bei ShellExecute bedeutet die erste 0 auch nur ein nicht notwendiges Handle...
Tja dann ist meine Schlußfolgerung auch nicht richtig. Da muß in der Tat eine Kopie vom Rückgabewert von c_str() angelegt werden.
bis bald
akari
-
Ok. Dann muß ich es anders machen. Danke
-
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.htmlWird 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.