cast CString in LPSTR
-
Wie kann ich szString[100] in LPSTR casten?
-
maRKus23 schrieb:
Wie kann ich szString[100] in LPSTR casten?
Was ist es denn
/* Ein "C"-String */ char szString[100] = "..."; // oder // ein MFC "CString" CString szString[100];?
Grüsse
*this
-
maRKus23 schrieb:
Wie kann ich szString[100] in LPSTR casten?
Was nun CString nach LPSTR? Dann musst Du GetBuffer verwenden. ein char szString[10] ist ein LPSTR!
-
Ich möchte ein CString nach LPSTR casten.
-
Wie Martin schon sagte - verwende dafür "GetBuffer()" (das liefert zwar einen LPTSTR, aber in ANSI-Umgebungen ist der identisch zu LPSTR).
-
CStoll schrieb:
Wie Martin schon sagte - verwende dafür "GetBuffer()" (das liefert zwar einen LPTSTR, aber in ANSI-Umgebungen ist der identisch zu LPSTR).
Wie wärs denn mit
#include <atlbase.h> //.., void MyFunc() { //... USES_CONVERSION; CString str(L"Foo"); LPSTR p = T2A(str.GetBuffer(str.GetLength())); }für beide Umgebungen?
Sonst haätte der OP nämlich wirkich den Puffer von str am Wickel.Grüsse
*this
-
Habe GetBuffer() verwendet, und funktioniert einwandfrei. Danke!!
-
Ich würde "CT2A" verwenden...
-
Dieser Code wird dan aber in jedem Fall nicht funktionieren:
LPSTR p = CT2A(str.GetBuffer(str.GetLength()));Denn der Zeiger wird sofort wieder ungültig!
-
Ich hätte auch eher an sowas gedacht

LPSTR str = strdup(CT2CA(cStrString)); // ... free(str);wobei, wenn ich es mir genau überlege ist es mit "GetBuffer" besser, *wenn* als ANSI übersetzt wird.
Sonst wird einem vermutlich nicht viel anderen übrig bleiben...
-
Interessant ist hier das T2A einen länger gültigen Zeiger liefert. Nur kann man das wieder nicht in einer Schleife benutzen...
-
GetBuffer() gibt nicht const zurück und T2A kopiert den String auf den Stack - das ist doch kein einfacher cast.
Dadurch wollte ich auch vermeiden dass der Puffer des CString manipuliert wird.
Was soll nun daran falsch sein?
Grüsse
*this
-
Ich habe nicht geschrieben, das dies falsch ist.
Ich habe eher über die Probleme mit CT2A gesprochen!Wenn aber ein LPSTR benötigt wird, und das war die Frage des OP. dann ist T2A nicht der Weg, denn dies würde verhindern, das Ergebnis zu nutzen. Dies aber würde ich denken wenn ein LPSTR benötigt wird...
Zudem hat es nur den Effekt unter einer Unicode Version, dass eine Kopie auf dem Stack angelegt wird. In einer MBCS Version passiert nichts.
-
Martin Richter schrieb:
Ich habe nicht geschrieben, das dies falsch ist.
Ich habe eher über die Probleme mit CT2A gesprochen!Wenn aber ein LPSTR benötigt wird, und das war die Frage des OP. dann ist T2A nicht der Weg, denn dies würde verhindern, das Ergebnis zu nutzen.
Wieso kann man den nicht nutzen? 
Martin Richter schrieb:
Zudem hat es nur den Effekt unter einer Unicode Version, dass eine Kopie auf dem Stack angelegt wird. In einer MBCS Version passiert nichts.
Autsch, da hst Du natürlich recht!

Mir ist zwar klar, das MS das aus Gründen der Effizienz macht, aber unterschiedliches Allokationsverhalten zwischen UNICODE und MBCS ist ja doch ziemlich ekelhaft...
Also, was nun - _bstr_t Overkill?

Grüsse
*this
-
Ich würde niemals via T2A einen Buffer erzeugen aus einem Const, der für Rückgabewerte verwendet werden darf/kann. Man kann schon, aber der Effekt ist begrenzt auf die Implementierung und auf die Art und Weise ob diese Makros überhaupt etwas tun.
T2A etc benötigt man ja auch nur, wenn man umwandeln muss. Im Allgemeinen ist das aber oft gar nicht nötig, wenn konsequent UNICODE / MBCS entwickelt wird, bzw. TCHAR überall direkt verwendet wird.
BSTR sind mit Sicherheit keine Lösung, aber ein Ansatz, den man in COM gut und gerne nutzen kan. Habe ich ncihts mit COM zu tun, meide ich BSTR's.