str->lpctstr
-
wie kann man std::string in LPCTSTR konvertieren?
hab google durchforstet aber kein code funktioniert irgendwie
-
void f(LPCTSTR pstr); //.. typedef std::basic_string<TCHAR> MyStr; MyStr str(_T("Hello")); f(str.c_str());
Edit: Kurze Erklärung LPCTSTR steht für "Zeiger auf einen konstanten TCHAR", mit dem typedef definierst du den string so, dass er mit TCHARs arbeitet. Ein TCHAR ist, je nachdem ob UNICODE definiert ist (Projekteinstellungen), 2 Byte, ohne UNICODE 1 Byte groß (UNICODE : wchar_t, sonst char).
c_str() liefert einen konstanten Zeiger auf den ersten Buchstaben.
-
was bedeutet
void f(LPCTSTR pstr);?
welche funktion ist das?
-
Diese Funktion formatiert die Festplatte, also nur mit Vorsicht aufrufen!
Nee, im Ernst, das ist eine Beispielfunktionsprototypendeklaration (), die einen LPCTSTR als Parameter erwartet.
-
Hoffentlich hilft das weiter:
http://www.c-plusplus.net/forum/276277
-
kapier ich net ganz
was soll in die funktion rein? und warum steht da f(str.c_str()); wenn void doch keinen rückgabewert hat?
-
bammes schrieb:
kapier ich net ganz
was soll in die funktion rein? und warum steht da f(str.c_str()); wenn void doch keinen rückgabewert hat?
Ouch... Sry, Der Tisch war zu hart.
std::basic_string<TCHAR> verwendet TCHAR als char-Typ. Intern wird ein TCHAR-Array die Daten speichern. Ein std::basic_string<TCHAR>::c_str() gibt diese rohe Zeichenkette zurück, das ist ein const TCHAR* - und wenn ich das richtig gelesen habe sollte das mit dem LPCTSTR kompatibel sein (hab kein Windows und somit auch keine Ahnung davon).
Die Funktionsdeklaration sagt, dass ein Parameter vom Typ LPCTSTR erwartet wird. Und so einen gibt das "str.c_str()" heraus. Das hat gar nix mit Rückgabewert zu tun (da kam meinem Kopf der Tisch in die Quere...).
-
sry dass ich erst jetzt antworte.
hatte was zu tun.also habs jetzt so geschrieben
void f(LPCTSTR pstr); //Außerhalb von main()
und innerhalb von main:
typedef std::basic_string<TCHAR> MyStr; MyStr str("Hello"); f(str.c_str());
warnung kommt:
[SPOILER]1>c:\users\dominik\documents\visual studio 2008\projects\ogamebot\ogamebot\main.cpp(29) : error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)': Konvertierung des Parameters 1 von 'const char [6]' in 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it' nicht möglich 1> with 1> [ 1> _Elem=wchar_t, 1> _Traits=std::char_traits<wchar_t>, 1> _Ax=std::allocator<wchar_t> 1> ] 1> Konstruktor für struct 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it' ist als 'explicit' deklariert 1> with 1> [ 1> _Elem=wchar_t, 1> _Traits=std::char_traits<wchar_t>, 1> _Ax=std::allocator<wchar_t> 1> ]
[/SPOILER]
-
So geht es:
typedef std::basic_string<TCHAR> MyStr; MyStr str(_T("Hello")); f(str.c_str());
Ist dir eigentlich klar was hier passiert?
Das typedef legt einfach einen string Typen an der TCHAR als char Typen annimmt. Das ist deshalb notwendig, da TCHAR entweder char oder wchar_t sein kann - also unicode oder nicht unicode. TCHAR ist eine Möglichkeit wie man sowohl unicode als auch nicht unicode anwendungen erstellen kann ohne den Code anpassen zu müssen.
_T() ist ein kleiner Trick. Denn "Hello" ist immer ein char*. Also nie unicode. L"Hello" wäre immer ein wchar_t* also immer Unicode. _T() macht nun je nachdem ob du als unicode oder nicht kompiliert daraus "Hello" oder L"Hello".
und LPCTSTR heisst nichts anderes als TCHAR const*
-
bammes schrieb:
und innerhalb von main:
typedef std::basic_string<TCHAR> MyStr; MyStr str("Hello"); f(str.c_str());
Das soll ja auch
MyStr str(_T("Hello"));
heißen. Bitte konsultiere die Dokumentation Deines Compilers bezüglich Zeichensätze, Unicode, TCHAR, _T, etc. Dieses TCHAR-Zeugs ist übrigens Compiler-spezifisch und kein Standard C++.
-
Shade Of Mine schrieb:
Denn "Hello" ist immer ein char*.
Wie wir in der Fehlermeldung sogar nachlesen können ist
"Hello"
vom Typconst char[6]
.
-
oke fehler _T Bezeichner wurde nicht gefunden
dann schau ich mal nach der Dokumentation wie man das ändert.
oder weis es auch einer von euch hab VC++ 2008 express
-
krümelkacker schrieb:
Shade Of Mine schrieb:
Denn "Hello" ist immer ein char*.
Wie wir in der Fehlermeldung sogar nachlesen können ist
"Hello"
vom Typconst char[6]
.ist aber viel einfach hier von char* und wchar_t* zu sprechen. ist viel leichter verständlich so und in diese Situation ist der Unterschied ja auch nicht relevant
@bammes:
hast du die windows.h inkludiert?
ansonsten schreib einfach selber L"Hello" statt _T("Hello")
-
Guck Dir doch einfach mal den Link an, den ich gepostet habe. Da gibts nämlich Lösungen für dein Problem.
-
hajo hab ich
typedef std::basic_string<TCHAR> MyStr; MyStr str(_T("Hello")); f(str.c_str());
-
_T kommt meines Wissens aus tchar.h, nicht windows.h.
-
achso oke es klappt
könnt ihr auch gleich helfen mit string in LPCWSTR?
-
theta schrieb:
Guck Dir doch einfach mal den Link an, den ich gepostet habe. Da gibts nämlich Lösungen für dein Problem.
Edit:
http://www.c-plusplus.net/forum/276277
http://www.c-plusplus.net/forum/viewtopic-var-t-is-260205-and-start-is-10.html
-
ach und konvertierung auf LPCTSTR von string klappt doch nicht.
habs vorhin falsch getestet.
folgende warnung wird ausgegeben:
1>c:\users\dominik\documents\visual studio 2008\projects\ogamebot\ogamebot\main.cpp(39) : error C2664: 'WritePrivateProfileStringW': Konvertierung des Parameters 3 von 'void (__cdecl *)(LPCTSTR)' in 'LPCWSTR' nicht möglich
-
Meine Glaskugel verrät mir, dass du versehentlich (?!) eine Funktionsdeklaration statt eines LPCTSTR erstellt hast.
bammes schrieb:
könnt ihr auch gleich helfen mit string in LPCWSTR?
Schau nochmal nach, was das W hier bedeutet und was das erste T in LPCTSTR bedeutet.