Typecasting const char*, TCHAR ...
-
Guten Tag,
ich habe den Dateinamen ohne PFAD in einem TCHAR...
nun brauch ich den Zeiger auf ein const char auf den DATEINAMEN + Pfad davor..
also z.b. im TCHAR steht "123.bmp"
und ich brauch const char* auf: "c:\test\test.bmp"
Kann mir jemand bitte erklären wie ich das mache?
Dank euch,
Schwanowski
-
1. Falls TCHAR ein char ist -> kein Problem
2. Falls TCHAR ein wchar_t ist -> Konvertierung erforderlichType- Casting ist nicht die Lösung! Konvertierung muss her.
Der C++ Standard Weg geht über std::ctype (Character Type Facet) über widen(..) (char -> wchar_t) bzw. narrow(..) (wchar_t -> char).
Unter Windows gibt es API Funktionen dafür:
MultiByteToWideChar http://msdn.microsoft.com/en-us/library/bb202786.aspx
WideCharToMultiByte http://msdn.microsoft.com/en-us/library/aa908730.aspxBzw. mit ATL kannst Du die Helfer Cx2y benutzen:
CA2W, CW2A und natürlich die ganzen Kombinationen mit T (Bsp. CA2T).
Hier die Übersicht: http://msdn.microsoft.com/en-us/library/87zae4a3(v=VS.80).aspxSimon
Edit:
Hier habe ich schon mal eine Implementation für Konvertierungen geschrieben, welche die Windows API Funktionen benutzt:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-260205-and-start-is-10.html
-
Moin, danke für die schnelle Antwort...
Woran erkenne ich ob es ein char oder ein wchar_t ist?
http://msdn.microsoft.com/en-us/library/aa365740(VS.85).aspx
TCHAR cFileName[MAX_PATH];
von diesem TCHAR rede ich!?
-
Ah, hab mir grad mal angesehen was wchar_t ist, müsste eigentlich ein wchar_t sein oder?? Da es sich um Dateien auf der Pladde handelt!?
-
Schwanowski schrieb:
Ah, hab mir grad mal angesehen was wchar_t ist, müsste eigentlich ein wchar_t sein oder?? Da es sich um Dateien auf der Pladde handelt!?
Nein. Damit hat es nichts zu tun.
TCHAR ist entweder char oder wchar_t, abhängig von dem im Projekt eingestellten Characterset (Multibyte, Unicode).
Default ist bei VS2005 und höher wchar_t.
Simon
-
Dank Dir schonmal, so langsam komm ich drauf (bin neu in C++, sorry)....
Also hab in den Projekteinstlelungen unter Konfigurationseinstellungen / Sprache nachgesehen und da steht "wchar_t als integrierten Typ behandeln: JA"...
Also muss ich von wchar_t in char casten, richtig? oder soll ich es in den Projekteinstellungen umstellen?
Eine Frage noch: Welchen Weg schlägst du mir von Deinen vorgeschlagenen vor? Windows API oder ATL?
Nutze Visual Studio 2008 standard und habe die openCV Lib eingebunden...
-
bzw nicht casten, sondern konvertieren, sorry (muss mich mal registrieren)
-
sorry, ich bins nochmal;)
hab mir nun WideCharToMultiByte durchgelesen, mir ist aber nicht ganz klar was ich bei CodePage einstellen muss? Wie gesagt sorry, bin Anfänger...
//int WideCharToMultiByte(
// UINT CodePage = ?,
// DWORD dwFlags freilassen,
// LPCWSTR lpWideCharStr = mein Pointer auf meienn TCHAR,
// int cchWideChar = -1,
// LPSTR lpMultiByteStr mein Pointer auf meinen CHAR,
// int cbMultiByte = 0,
// LPCSTR lpDefaultChar = NULL,
// LPBOOL lpUsedDefaultChar = NULL
//);So würde ichs einstellen, nur CodePage ist mir unklar
-
Schwanowski schrieb:
Also hab in den Projekteinstlelungen unter Konfigurationseinstellungen / Sprache nachgesehen und da steht "wchar_t als integrierten Typ behandeln: JA"...
Nein, das ist nicht die Einstellung, die ich erwähnt habe.
http://msdn.microsoft.com/en-us/library/8x480de8.aspxSchwanowski schrieb:
Eine Frage noch: Welchen Weg schlägst du mir von Deinen vorgeschlagenen vor? Windows API oder ATL?
Ich würde die Windows API benutzen. Am besten den Code den ich mal gepostet habe (stringutil::StringA, stringutil::StringW, stringutil::StringT).
Simon