FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

C++ Datentyp: Zeichen Probleme.

C++ Datentyp: Zeichen Probleme. 2009-06-27 02:18
Anonymer User
Ich hab nen riesen Problem mit C++ :( und ich brauch dringend Hilfe!!!

Ich will ein externes Consolenprogramm aufrufen.
Das ganze geschiet mittels "CreateProcess()" vonstatten gehen (http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx)
Das Command-Line-Argument muss scheinbar vom Typ LPTSTR sein.

Mein Problem ist folgendes:
Ich will ein festgelegtes Programm starten. Das ist meinetwegen hard im Code eincodiert.
Was jedoch variabel sein muss, sind die Parameter die diesem Programm mitgegeben werden müssen.
Also beispielsweise => wpro.exe -s 22 -kw. Die Parameter wollte ich aus den argv[] rausfischen.

Soweit sogut: Ich komm mit dem granzen rumgeeier mit den verschiedenen Datentypen für die Zeichen nicht klar.
Ich brauch ja am ende ein LPTSTR. Die argv[] sind ja char* oder TCHAR*, bei dem hard eincodierten (z.B. wpro.exe) wär ich flexibel. Wie mach ich das rumgecaste ganze am geschicktesten?

Btw. bei:
char* test = "wpro.exe";
strcat(test, argv[ 1 ]);

Bekomm ich immer nen Fehler (siehe Attachment). Warum? Weshalb? Wieso? :(
Anhänge Unbenannt-1.jpg

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 04:20
Muelli
Weil dein Pointer nicht in beschreibbaren Speicher zeigt :)
Wenn du deinen String mallocst und dann da rein strcattest, wird es gehen.

Dein Text "wpro.exe" wird im Textsegment abgelegt und da darfst du zur Laufzeigt nicht reinschreiben. Nur auf dem Stack und im Heap solltest du rummachen duerfen.

Und mit deinem Zeichenproblem hab ich keine Ahnung, wie ein Windowssystem sich das so vorstellt. Ich meine mal gelesen zu haben, dass die intern UTF-16 verwenden, du muesstest also wohl irgendwie deine 8bit Codepage-1215 (?) kodierte Eingabe zu etwas kompatiblem konvertieren. Ich wuerde erwarten, dass mir dieses Windows eine Funktion dafuer anbietet.

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 04:30
Anonymer User
char* test = "wpro.exe";
strcat(test, argv[ 1 ]);
Das kann natürlich nicht funktionieren, weil "wpro.exe" nur ein const char[ 9 ] (Array von 9 Byte) ist, auf das der Zeiger test zeigt.
Mit strcat versuchst Du nun, an dieses Array weitere Zeichen "hintendran" zu kopieren, der Speicher dort ist von dir aber gar nicht reserviert worden, d.h. Du schreibst über irgendwas anderes drüber, deswegen die Exception.

Dies sollte gehen:
char test[1000];
strcpy(test,"wpro.exe");
strcat(test,argv[ 1 ]);


Das ist übrigens auch nicht wirklich C++, sondern nur C Stringmanipulation und ist unsicher, weil auch der test[1000] Buffer bei zu langen Parametern überlaufen kann.

C++ wäre dies:
#include<string>
#include<windows.h>


std::basic_string<TCHAR> test = _T("wpro.exe")
for (int i = 0; i < argc; ++i)
{
    test += _T(" ");
    test += argv;
}
TCHAR buffer[32768];
_tcsncpy_s(buffer,32768,test.c_str(),32768);
CreateProcess(NULL, buffer, NULL,  … usw.

Dieser Code sollte sowohl für Unicode-als auch für ANSI-Zeichensatz funktionieren.

Leider ist auch hier der Rückfall auf C-Strings nicht zu vermeiden, weil CreateProcess ausgerechnet für den 2. Parameter einen beschreibaren Puffer für 32768 Zeichen (mit 2 Byte pro Zeichen bei Unicode) haben möchte und den kann die basic_string Klasse leider nicht liefern. Deswegen muß per Hand ein Puffer angelegt und der Inhalt dahin kopiert werden.

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 10:02
Fred
Arrays und Schleifen sind aber auch nicht wirklich C++ [25]
Mit der Windows-API und den verschiedenen String-Arten kenne ich mich nicht wirklich aus, aber so würde ich es machen:
#include <algorithm> #include <iterator> #include <sstream> #include <string> #include <vector> #include <windows.h> int main(int argc, const char **argv) {     std::stringstream stream;     stream << "wpro.exe "; // note the space at the end     std::copy(&argv[1], &argv[argc], std::ostream_iterator<const char*>(stream, " "));     std::string str = stream.str();     std::vector<TCHAR> vec(32768);     vec.assign(str.begin(), str.end()-1); // copy everything except last space     LPTSTR p = &vec[0]; // p can now be used with legacy APIs }
weil CreateProcess ausgerechnet für den 2. Parameter einen beschreibaren Puffer für 32768 Zeichen (mit 2 Byte pro Zeichen bei Unicode) haben möchte
Oh, das hatte ich eben überlesen. Fixed.

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 13:06
Anonymer User
okay…danke erstmal.
Aber Fred, ist nen ganzer Vektor wegen einer soner dummen Stringaddition nicht der absolute Overkill? Tauben auf Kanonen und so weiter?!?!

Ich wills halt äußerst elegant haben (möglichst wenig casten), und gleichzeitig zu wenig overkill wie nur möglich…

Trotzdem schon mal Danke für eure Tipps!

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 14:03
Fred
Aber Fred, ist nen ganzer Vektor wegen einer soner dummen Stringaddition nicht der absolute Overkill? Tauben auf Kanonen und so weiter?!?!
Du meinst Kanonen auf Spatzen [25]

Ich mag std::vector, weil ich mich nicht selber um Vergrößern und Einhaltung der Grenzen und ähnlichen Mist kümmern muss. Arrays würde ich in sicherheitskritischen Anwendungen nie verwenden, auch wenn man vielleicht irgendwo 0,1% Performance sparen könnte.

Isn't there enough fast, unreliable software already? [24]

RE: C++ Datentyp: Zeichen Probleme. 2009-06-27 18:40
Anonymer User
Isn't there enough fast, unreliable software already? [24]

Nööö, aber eine mehr oder weniger macht da auch keinen Unterschied mehr ;)

Danke !