C++ CString nach LPWSTR

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.077
Wie das Thema schon oben... hab schon hunderte seiten abgesucht... nix vernünftiges was unter MFC funktioniert. Ich bekomme schon den CString auf LPWSTR umgewandelt aber nicht alle CString Zeichen sind dann auch in den LPWSTR drinne. Hat da jemand einen Vorschlag?

Danke
 
In der Doku mal unter A2W nachschauen.

void MyFunction(void)
{
// Muss in der Funktion vor der ersten Verwendung von A2W deklariert werden
USES_CONVERSION;

CString strBla = _T("Test");

// Umwandeln, cast wegen lpsz von A2W erwartet.
LPWSTR lpwstrMystring = A2W((const char*)strBla);

// Irgendetwas
wprintf_s(L"Bla ist %s",lpwstrMystring );
}
 
Warum definierst du nicht gleich _UNICODE für deine Anwendung? ... oder geht es dir wirklich explizit um die Umwandlung von ASCII nach Unicode?
CString ist portabel und beherrscht daher Unicode ohne Probleme, wenn es definiert ist. Das Beispiel von Black Man würde dann natürlich nicht mehr funktionieren, wäre aber auch nicht nötig.
 
Fehler 1 error C2440: 'Typumwandlung': 'CString' kann nicht in 'char *' konvertiert werden
BlackMan schrieb:
In der Doku mal unter A2W nachschauen.

void MyFunction(void)
{
// Muss in der Funktion vor der ersten Verwendung von A2W deklariert werden
USES_CONVERSION;

CString strBla = _T("Test");

// Umwandeln, cast wegen lpsz von A2W erwartet.
LPWSTR lpwstrMystring = A2W((const char*)strBla);

// Irgendetwas
wprintf_s(L"Bla ist %s",lpwstrMystring );
}

MichaelR schrieb:
Warum definierst du nicht gleich _UNICODE für deine Anwendung? ... oder geht es dir wirklich explizit um die Umwandlung von ASCII nach Unicode?
CString ist portabel und beherrscht daher Unicode ohne Probleme, wenn es definiert ist. Das Beispiel von Black Man würde dann natürlich nicht mehr funktionieren, wäre aber auch nicht nötig.
Soweit ich weiss ist mein Programm schon mit Unicode Zeichen.
 
Zuletzt bearbeitet:
Zitat:
Fehler 1 error C2440: 'Typumwandlung': 'CString' kann nicht in 'char *' konvertiert werden

probiere mal (mein Beispiel war aus VC++6)
LPWSTR lpwstrMystring = A2W(_strdup((const char*)strBla));
 
Das hatte ich auch mal :)

Einfach ein _T(exampleString); machen, sprich ein _T davor schreiben.

So funktionierte es bei mir ohne Anstand.
 
roker002 schrieb:
Soweit ich weiss ist mein Programm schon mit Unicode Zeichen.

Entweder musst du in deinem Programm _UNICODE als Preprozessor Direktive definieren oder am in den Projekteinstellungen unter 'Character Set' setzen - je nachdem, womit du arbeitest.

Für die direkte Umwandlung, probiere mal folgendes:
LPWSTR lpwstrMystring = T2W(strBla);

...oder auch, je nach ATL Version:
LPWSTR lpwstrMystring = CT2W(strBla);

Den Type cast kannst du hier weglassen. Alternativ kannst du das aber auch davor schreiben: LPWSTR lpwstrMystring = CT2W((LPCTSTR)strBla);

Die Makros mit dem 'T' drin sind generisch. D.h. das sie im Falle von Unicode nichts machen, was ja in deinem Sinne sein sollte, und nur singly byte characters umwandeln. Spätestens wenn du auf UNICODE umstellst, wirst du dankbar sein, wenn du nicht alles neu anpassen musst :)
Es macht auch Sinn, wenn du generell die portablen Funktionen benutzt. Also TCHAR statt char, _tcscpy statt strcpy usw.
 
Code:
Fehler 1 error C2440: 'Typumwandlung': 'CString' kann nicht in 'char *' konvertiert werden
Immer noch das gleiche Fehler. Hab VS 9, falls irgendwas.
BlackMan schrieb:
Zitat:
LPWSTR lpwstrMystring = A2W(_strdup((const char*)strBla));

Also mit _T() wo vor setzen? vor dem CSTRING? ne damit hab ich kein Problem dass er den CSTRING nicht erkennt. mein Problem ist ich kriege den scheiss CString nicht vernünftig in LPWSTR umgewandelt.
Proktologe schrieb:
Das hatte ich auch mal :)

Einfach ein _T(exampleString); machen, sprich ein _T davor schreiben.

So funktionierte es bei mir ohne Anstand.

MichaelR schrieb:
Entweder musst du in deinem Programm _UNICODE als Preprozessor Direktive definieren oder am in den Projekteinstellungen unter 'Character Set' setzen - je nachdem, womit du arbeitest.

Für die direkte Umwandlung, probiere mal folgendes:
LPWSTR lpwstrMystring = T2W(strBla); <--- Funktioniert nicht... liegt ehe an der ATL version?

...oder auch, je nach ATL Version:
LPWSTR lpwstrMystring = CT2W(strBla); <--- Funktioniert aber mit dem gleichen Scheiss erklärs später.

Den Type cast kannst du hier weglassen. Alternativ kannst du das aber auch davor schreiben: LPWSTR lpwstrMystring = CT2W((LPCTSTR)strBla);

Allgemein zu dem CString und Co. Also CString kann auch als LPCWSTR und LPCTSTR genutzt werden, soweit es in der Docu von Microsoft steht.
mein Hauptptoblem ist. Ich krieg den String umgewandelt aber nicht komplett. Ich kriege immer die ersten 2 oder 3 String in den LPWSTR umgewandelt und der rest verabschiedet sich. Na toll was soll ich den machen wenn ich den Rest nicht habe. Ich muss wahrscheinlich die einzelnen CString per hand Umwandeln. Mir fehlt aber dazu die Erfahrung.

also anhand des beispiels...
ich habe aus der DB den CString (alles was über CRecordset rauskommt wird automatisch an die Variable angepasst, ich glaube nur auf CString) "abcde" und wenn ich den umwandle auf auf LPWSTR bekomme ich nur "ab" raus. Reines CString bleibt so wie aus der DB. Das ist mein Hauptproblem. Die Darstellung ist im Arsch :P

hat da sonst eine noch ne idee?

ach ja Komischerweise werden nummerische Werte aus der Datenbank dadurch nicht beeinflusst. wenn ich 12345 habe dann wird es auch in 12345 auf LPWSTR konvertiert.

daaaaaaaaaaaaaanke
 
Zuletzt bearbeitet:
roker002 schrieb:
Allgemein zu dem CString und Co. Also CString kann auch als LPCWSTR und LPCTSTR genutzt werden, soweit es in der Docu von Microsoft steht.
Eingeschränkt. LPCWSTR kannst du nur dann verwenden, wenn _UNICODE definiert ist.
Jedenfalls ist es seltsam, dass es so nicht funktioniert.
Probier doch mal:
LPWSTR lpwstrMystring;
int iSizeOfWString = MultiByteToWideChar( CP_ACP, 0, strBla, strBla.GetLength()+1, wstrMystring,0); // gibt dir die benötigte Puffergröße für den wstring
lpwstrMystring = new WCHAR[iSizeOfWString];
MultiByteToWideChar( CP_ACP, 0, strBla, strBla.GetLength()+1, wstrMystring,iSizeOfWString);


Ich kann jetzt nicht überprüfen, ob es klappt aber schau dir halt mal die Funktion MultiByteToWideChar in der MSDN help an.
 
Zurück
Oben