Frage CString to wchar_t[30]
-
Hallo,
ich möchte eine Konvertierung von CString zu einem wchar_t[30] Feld machen.
Ich hab früher char benutzt, doch möchte ich jetzt UNICODE verwenden. Für den Fall gibt es ja schon viel im Netz aber das läuft nicht so recht bei mir. Ich hab etwas rumprobiert und mit dem Folgendem Code läufts einigermaßen - ist aber nicht sehr gut:CString cs(_T("Unicode zeichen")); wchar_t wc[MaxStrSize]; if(cs.GetLength()>MaxStrSize) cs.Delete(MaxStrSize,cs.GetLength()-MaxStrSize); //überlänge wegschneiden wmemcpy_s(wc,MaxStrSize,cs,cs.GetLength()-1);könnt ihr mir sagen, wie ich es am besten mache? Wie gesagt, für unicode.
-
So, um das ganze noch etwas aufzupeppen:
ich hab das mit der Konvertierung jetzt so gemacht:int max = 30; wchar_t wc[max]; CString str(_T("kann sehr lang und UNICODE sein")); wmemset(wc, 0, sizeof(wc)); wmemcpy_s(wc, max-1, str, str.GetLength());Funktioniert soweit ganz gut, nur hab ich, nachdem ich alles umgestellt hatte, beim schließen des Programms ein HEAP CORRUPTION bekommen. Bischen nachgelesen und auf Martin Richters blog eine nette Anweisung gefunden:
_CrtSetDbgFlag(_CrtSetDbgFlag(0)|_CRTDBG_CHECK_ALWAYS_DF);hab ich in InitInstance geschrieben. So, nun kommt beim Verlassen der ersten Funktion, wo wmemset und wmemcpy_s vorkommt ein Haltepunkt bzw. DebugBreak. (Beim starten des Programms)
Edit: Das Ganze wird mehrere Male hintereinander gemacht.
Was verursacht an obrigem Code denn ein Problem?
-
Ohne Konvertierungund gleich Unicode...
CStringW str(L"kann sehr lang und UNICODE sein");BTW: Wenn Dein Projekt mit _UNICODE kompiliert wird, dann ist CString beerits Unicode!
-
Das Projekt ist Unicode.
Also nach vielem rumprobieren hab ich dann so gemacht: eine kleine Funktion geschrieben:bool CStrToWChat(wchar_t wc[], CString str, size_t maxStrSize) { if(str.GetLength() > maxStrSize-1) str.Delete(maxStrSize,str.GetLength()-maxStrSize); memset(wc, 0, sizeof(wc[0])*(maxStrSize-1)); wmemcpy(wc, str,maxStrSize-1); for(UINT n=str.GetLength();n<maxStrSize;n++) {wc[n]=0;} wc[maxStrSize-1]=0; //oder \0 ? } const size_t max = 100; wchar_t wc[max]; CString str(_T("langer Unicode String")); CStrToWChar(wc,str,max);Ich denke, der Code ist alles andere als Optimal. merkwürdig war, das es bei diversen versuchen mit dem Code (z.B. bei memset und size_t_Size) auf meinem Rechner fehlerlos lief und auf anderen Rechnern zu Exceptions kam (0xc0000005). So, mit dem Code, kommen sie nicht mehr.
Micha
-
Wenn das unicode ist, was soll dieser ganze Blödfug? Deine Funktion CStrToWChar erzeugt bei mir ein absolutes Grauen. Alleine, dass sie den eingehenden CString kopieren muss.
Beschäftige Dich doch mal bitte ein wenig mit der CRT, der T Notation und den entsprechenden Samples. Du kannst dich direkt die entsprechendde CRT Funktion nutzen.Ein CString hat doch einen eingebauten operator der einen LPCTSTR liefert. In deinem Falle bei einem Unicodeprojekt also einen const wchar_t *!
const size_t max = 100; wchar_t wc[max]; CString str(_T("langer Unicode String")); _tcscpy_s(wc,_countof(wc),str);