Was ist der Unterschied zwischen LPCSTR
, LPCTSTR
und LPTSTR
?
Warum müssen wir dies tun, um einen String in eine LV
/ _ITEM
Strukturvariable zu konvertieren pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
c++
windows
visual-c++
mfc
NothingMaster
quelle
quelle
Antworten:
So beantworten Sie den ersten Teil Ihrer Frage:
LPCSTR
ist ein Zeiger auf eine konstante Zeichenfolge (LP bedeutet Long Pointer )LPCTSTR
ist ein Zeiger auf eineconst TCHAR
Zeichenfolge (TCHAR
entweder ein breites Zeichen oder ein Zeichen, je nachdem, ob UNICODE in Ihrem Projekt definiert ist).LPTSTR
ist ein Zeiger auf eine (nicht konstante)TCHAR
ZeichenfolgeIn der Praxis haben wir, wenn wir in der Vergangenheit darüber gesprochen haben, der Einfachheit halber den "Zeiger auf eine" Phrase weggelassen, aber wie von Leichtigkeitsrennen im Orbit erwähnt, sind sie alle Zeiger.
Dies ist ein großartiger Codeprojekt-Artikel , der C ++ - Zeichenfolgen beschreibt (siehe 2/3 unten für ein Diagramm, in dem die verschiedenen Typen verglichen werden).
quelle
extern "C"
. Abgesehen davon sollte es definitiv entweder das "Zeiger" -Bit oder eine spezifische Beschreibung als C-Zeichenfolge benötigen.Schnell und dreckig:
LP
== L ong P ointer. Denken Sie nur an Zeiger oder Zeichen *C
= C onst, in diesem Fall denke ich, dass die Zeichenfolge eine Konstante ist, nicht der Zeiger eine Konstante.STR
ist Zeichenfolgedas
T
ist für ein breites Zeichen oder Zeichen (TCHAR) , je nach Kompilierungsoptionen.quelle
8-Bit-AnsiStrings
char
: 8-Bit-Zeichen - zugrunde liegender C / C ++ - DatentypCHAR
: Alias vonchar
- Windows-DatentypLPSTR
: nullterminierte Zeichenfolge vonCHAR
( L ong P ointer)LPCSTR
: Konstante nullterminierte Zeichenfolge vonCHAR
( L ong P ointer)16-Bit-UnicodeStrings
wchar_t
: 16-Bit-Zeichen - zugrunde liegender C / C ++ - DatentypWCHAR
: Alias vonwchar_t
- Windows-DatentypLPWSTR
: nullterminierte Zeichenfolge vonWCHAR
( L ong P ointer)LPCWSTR
: Konstante nullterminierte Zeichenfolge vonWCHAR
( L ong P ointer)je nach
UNICODE
definierenTCHAR
: Alias vonWCHAR
wenn UNICODE definiert ist; AndernfallsCHAR
LPTSTR
: nullterminierte Zeichenfolge vonTCHAR
( L ong P ointer)LPCTSTR
: Konstante nullterminierte Zeichenfolge vonTCHAR
( L ong P ointer)So
Bonuslesung
TCHAR
→ Text Char ( archive.is )quelle
Hinzufügen zu Johns und Tims Antwort.
Sofern Sie nicht für Win98 codieren, gibt es nur zwei der mehr als 6 Zeichenfolgentypen, die Sie in Ihrer Anwendung verwenden sollten
LPWSTR
LPCWSTR
Der Rest soll ANSI-Plattformen oder Dual-Compilations unterstützen. Diese sind heute nicht mehr so relevant wie früher.
quelle
std::string
weil es immer noch eine ASCII-basierte Zeichenfolge ist undstd::wstring
stattdessen bevorzugen .*A
Versionen von WinAPI mit der UTF-8-Codepage kompatibel zu machen, sind sie plötzlich viel relevanter. ; PUm den zweiten Teil Ihrer Frage zu beantworten, müssen Sie Dinge wie tun
weil die
LVITEM
Struktur von MS einenLPTSTR
, dh einen veränderlichen T-String-Zeiger hat, keinenLPCTSTR
. Was Sie tun, ist1) konvertiere
string
(aCString
a rate) in aLPCTSTR
(was in der Praxis bedeutet, die Adresse seines Zeichenpuffers als schreibgeschützten Zeiger zu erhalten)2) Konvertieren Sie diesen schreibgeschützten Zeiger in einen beschreibbaren Zeiger, indem Sie seine
const
-ness wegwerfen.Es hängt davon ab, wofür verwendet
dispinfo
wird, ob die Möglichkeit besteht, dass IhrListView
Anruf versucht , dies durchzuschreibenpszText
. Wenn dies der Fall ist, ist dies möglicherweise eine sehr schlechte Sache: Schließlich haben Sie einen schreibgeschützten Zeiger erhalten und dann beschlossen, ihn als beschreibbar zu behandeln: Vielleicht gibt es einen Grund, warum er schreibgeschützt war!Wenn es ein
CString
ist, mit dem Sie arbeiten, haben Sie die Möglichkeit zu verwendenstring.GetBuffer()
- das gibt Ihnen absichtlich eine beschreibbareLPTSTR
. Sie müssen dann daran denken, aufzurufen,ReleaseBuffer()
wenn die Zeichenfolge geändert wird. Oder Sie können einen lokalen temporären Puffer zuweisen und die Zeichenfolge dort kopieren.99% der Zeit wird dies unnötig sein und die Behandlung
LPCTSTR
als einLPTSTR
Wille funktionieren ... aber eines Tages, wenn Sie es am wenigsten erwarten ...quelle
xxx_cast<>()
stattdessen verwenden.xxx_cast<>
zwei verschiedene klammerbasierte Casting-Stile verwendet, anstatt sie zu mischen!