CString Verständnisfrage
-
Hallo,
ich suche im Netz nach einer Erklärung was es mit der Headerdatei string.h, der Klasse CString und einem char Array auf sich hat.
Mir ist klar bzw. verstehe ich derzeit so, alle Zeichenketten in C++ sind mit \0 terminiert um überschreiben zu verhindern. (nicht ganz klar formuliert ich weiss)
Die CString Klasse gehört denke ich MFC an und liefert nach meinem Verständnis einen Baukasten um mit Strings leichter zu arbeiten.
String.h nun eine Art Erleichterung, wobei mir von verschiedenen Stelle abgeraten wurde diese zu verwenden....
Warum ich versuche das ganze zu hinterfragen ist, weil ich versuche einen CString in eine andere Methode zu übertragen.
Da ich noch viel mit lernen beschäftigt bin, sehe ich im Moment nur den Weg mittels eines Zeigers mir die Adresse des Objektes zu merken damit ich mit dem Objekt in anderen Methoden arbeiten kann und da scheitert es....
Es wäre schön wenn mich Jemand mit einem kurzen Beispiel und einer kleinen Erläuterung weiterhelfen könnte. Auch verwirren Sacherverhalte wie WPARAM,LPARAM mich bei meinem bestreben.....
Mein Versuch sieht folgendermaßen aus:
CString *strCmdline = new CString; //GET CmDLine *strCmdline=theApp.m_lpCmdLine; if(*strCmdline.Left(1) == "\"") { *strCmdline = *strCmdline.Mid(1,strCmdline.GetLength()-2); } *strCmdline+="\n";
-
char* ist (technisch) ein Zeiger auf ein Zeichen - praktisch deutet man ihn als einen Zeiger auf ein Nullterminiertes Zeichenarray (das \0 dient nur als Marke "hier ist der String zu Ende"). <string.h> alias <cstring> liefert einige Funktionen, mit denen du diese Zeichen-Arrays verarbeiten kannst.
Die Klasse CString ist eine Microsoft-Erfindung zur String-Verarbeitung - sie kapselt intern einen char* und nimmt dir die gesamte Speicherverwaltung ab. Das bedeutet besonders, daß du den CString nicht unbedingt auf dem Heap ablegen mußt:
CString strCmdline; //GET CmDLine strCmdline=theApp.m_lpCmdLine; if(strCmdline.Left(1) == "\"") { strCmdline = strCmdline.Mid(1,strCmdline.GetLength()-2); } strCmdline+="\n";(die Methoden wie Left() oder Mid() kapseln entsprechende Aufrufe in die string.h Funktionen)
-
Aber wie übergebe ich das Cstring Objekt nun einer anderen Methode...Ich habe auch versucht die CString Variable im Header public zu setzen aber jedesmal meckert der Compiler das er dieses nicht kennt?
Oder anders formuliert in einer Methode kann ich bequem mit dem CString arbeiten aber in anderen Methoden die damit weiterarbeiten sollen eben nicht und ich verstehe nicht wieso.......
-
Wie versuchst du es denn zu übergeben?
Sowas sollte gehen:
void funk(CString bla);wie mit jedem anderen Datentyp halt auch.

-
estartu schrieb:
Wie versuchst du es denn zu übergeben?
wie mit jedem anderen Datentyp halt auch.
Die Problemmatik ergibt sich aus der Tatsache das ich mit Threads experimentiere
DWORD WINAPI ThreadFunc(LPVOID Data) { return((DWORD)Data); }HANDLE hThread; DWORD dwThreadID; int index=NULL; hThread = ::CreateThread( NULL, 0, ThreadFunc, (LPVOID)index, 0,&dwThreadID );Da meine gesammelten Informationen bzgl. Threads recht schwammig sind, tue ich mir auch sehr schwer die Logik zu begreifen, dieser Parameter Data ist unablässig, schreibe ich im Aufruf bei CreateThread meinen CString dazu bzw. erweitere die Parameterliste der Threadfunc meckert der Compiler das er den CString nicht konvertieren kann.
Ich suche in der MSDN stosse auf AfxBeginThread(); finde ich im Netz das und jenes aber eine letzendliche Klarheit darüber habe ich nicht. Vielleicht kommt eines Tages der Tag an dem ich Glück habe einen Tutor zu finden den ich mit Fragen löchern kann....nunja
Ich weiss nicht was schlimmer ist...
Zuviele Informationen zu erhalten wovon man nicht von Sinnig und Unsinnig unterscheiden kann.
Oder zu wenig Informationen zu haben und das Rad bzw. Verständnis neu erfinden zu müssen....
-
... HANDLE hThread; DWORD dwThreadID; DWORD dwStatus; // Ein neuen CString ... CString *psMyStringToPass = new CString(_T("Der soll im Thread auftauchen ...")); // ... der mit eben Data an einen Thread übergeben wird hThread = ::CreateThread( NULL, 0, ThreadFunc, (LPVOID)psMyStringToPass, 0,&dwThreadID ); // Achtung bei dieser Quick&Dirty, hier musst Du warten, bis der Thread beendet ist, z.B. // Aber Obacht, das ist Quick&Dirty! An Synchrionisation, Events, Critical // Sections, Mutexes, ... kommst Du nicht vorbei. Da musst Du lesen ... VERIFY(::GetExitCodeThread(m_pExtensionThread->m_hThread, &dwStatus)); while( dwStatus == STILL_ACTIVE && hThread != NULL ) { ::GetExitCodeThread(hThread hThread, &dwStatus ); } // Speicher freigeben nicht vergessen ... delete psMyStringToPass; ...So, und in deiner Threadfunktion:
DWORD WINAPI ThreadFunc(LPVOID Data) { CString *pPassedString = (CString *)Data; if( pPassedString != NULL ) { TRACE("Das kam: %s", *pPassedString ); } // den Fehlercode kannst Du natürlicc frei setzten ... return( 0L ); }Gruss, Gio