TCHAR einfach nach CString casten?!

Ravebaby

Erfahrenes Mitglied
Hallo,

ich bekomme alle vorhandenen Laufwerke meines Rechners als TCHARs zurück geliefert.
Wenn ich sie mir ausgeben lasse, erscheinen folgende Buchstaben: A: C: D: E: U: Z:
Nun möchte ich die Werte in ein CArray<CString> speichern, um sie nacher mittels einer Iteration an der richtigen Stelle ausgeben zu lassen.
Bei den Google Groups habe ich gelesen, dass man zur Konvertierung von TCHAR zu CString einfach casten kann: Mein Code:
Code:
TCHAR g_szDrvMsg[] = _T("\tA:\n");
...
CString devicename = CString(g_szDrvMsg);
Nach dem casten werden die CStrings in das Array geschrieben.
Geb ich aber nun alle Werte des Arrays aus erscheinen plötzlich alle Buchstaben des Alphabets und sehen auch noch recht kryptisch aus.
Kann man doch nich einfach so casten?!
 
TCHAR in CString überführen ist eigentlich kein Problem. Da CString implizit castet, funktioniert auch die einfache Zuweisung:
CString devicename = g_szDrvMsg;

Wie machst du das mit dem Array, nimmst du da ein CStringArray?
 
Hast Du mal überprüft, ob "devicename" vernünftige Strings enthält? Wenn ja, geht wahrscheinlich bei deiner Array-Implementierung etwas schief, evt. solltest du dazu auch mal etwas Sourcecode zeigen.
Ansonsten gibt es ja in der MFC die Klasse "CStringArray". Damit tut man sich wahrscheinlich etwas leichter als mit der allgemeinen CArray-Klasse.
 
Das ist alles sehr komisch, ich hoff, ich kann es einigermaßen verständlich in Worte fassen...
Code:
void CFileExplorerSideView::GetAllDevices()
{
	TCHAR g_szDrvMsg[] = _T("\tA:\n");
	ULONG uDriveMask = _getdrives();

	if (uDriveMask == 0)
		printf("_getdrives() failed with failure code: %d\n", GetLastError());
	else {
		printf("The following logical drives are being used:\n");

		while (uDriveMask) {
			if (uDriveMask & 1)
				TRACE(g_szDrvMsg);
				//TRACE("\n");
				// convert TCHAR to CString
				CString devicename = CString(g_szDrvMsg);
				TRACE(devicename);
				TRACE("\n");
				// fill an array with all devices
				m_deviceArray.Add(devicename);

			++g_szDrvMsg[1];
			uDriveMask >>= 1;
		}
	}
}
Bei dem "TRACE(g_szDrvMsg);" gibt er mir nur genau die 5 Laufwerke aus: A: C: ... Aber auch oft eine leere Zeile zwischendurch.
Ruf ich nach dem casten "TRACE(devicename);" auf, gibt er mir alle Buchstaben des Alphabets aus und die die als Laufwerbuchstaben vorkommen doppelt, also A: A: B: C: C:...
Kommentier ich jedoch das "TRACE(g_szDrvMsg);" und möchte mir nur das Ergebnis nach dem Casten ausgeben lassen, also "TRACE(devicename);" gibt er mir als Fehlermeldung: 'devicename' undeclared identifier.

Jetzt versteh ich grad nich mehr viel...
 
Dir fehlen die geschweiften Klammern für den if-Block:

Code:
if( uDriveMask & 1 )
{
    TRACE(g_szDrvMsg);
    //TRACE("\n");
    // convert TCHAR to CString
    
    CString devicename = CString(g_szDrvMsg);
    
    TRACE(devicename);
    TRACE("\n");

    // fill an array with all devices
    m_deviceArray.Add(devicename);
}
 
Vielen Dank!! Nun gibt er jedoch immer noch Mist aus. Bei "TRACE(devicename);"
gibt er zwar nur noch die 5 Laufwerksbuchstaben (jeweils einmal) aus, aber es kommt immer ein leerer Eintrag dazwischen. Führt das dann zu Mist in der Ausgabe?
 
Der leere Eintrag rührt wahrscheinlich daher, dass du bei "TCHAR g_szDrvMsg[] = _T("\tA:\n");" bereits einen Zeilenvorschub eingebaut hast und mit "TRACE("\n");" nochmal einen ausgibst. Das ergibt eine Leerzeile.
 
hast recht, also kann es daran wohl nicht liegen. Warum gibt er denn dann solch einen Mist aus?! Es sieht so aus, als würde er vor jeden Laufwerkbuchstaben noch einen senkrechten Strich malen. Man kann es schon lesen, aber es sieht halt nich schön aus ;)
 
Zuletzt bearbeitet:
Der senkrechte Strich ist der Tabulator, den du vor dem Laufwerksbuchstaben hast. Die Edit-Controls können den nicht richtig ausgeben.
 
Zurück