LPCSTR
、LPCTSTR
、およびLPTSTR
の違いは何ですか?
文字列をLV
/_ITEM
構造変数pszText
に変換するためにこれを行う必要があるのはなぜですか:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
質問の最初の部分に答えるには:
LPCSTR
はconst文字列です
LPCTSTR
はconst TCHAR
文字列です(TCHAR
は、UNICODEがプロジェクトで定義されているかどうかに応じてワイド文字または文字です)
LPTSTR
は(非定数)TCHAR
文字列です
これは素晴らしいです codeproject article C++文字列の説明(異なるタイプを比較するチャートについては2/3をご覧ください)
早くて汚い:
LP
== L ong P ointer。ポインタまたはchar *を考える
C
= C onst、この場合、文字列はconstであり、ポインターはconstではないことを意味すると思います。
STR
はstringです
T
は、コンパイルオプションに応じてワイド文字または文字(TCHAR)を表します。
char
:8ビット文字-基になるC/C++データ型CHAR
:char
のエイリアス-Windowsデータ型LPSTR
:nullで終わるCHAR
の文字列(LongPointer)LPCSTR
:CHAR
のヌルで終わる定数文字列(LongPointer)wchar_t
:16ビット文字-基になるC/C++データ型WCHAR
:wchar_t
のエイリアス-Windowsデータ型LPWSTR
:nullで終わるWCHAR
の文字列(LongPointer)LPCWSTR
:WCHAR
のヌルで終わる定数文字列(LongPointer)UNICODE
defineに応じてTCHAR
:UNICODEが定義されている場合のWCHAR
のエイリアス。それ以外の場合はCHAR
LPTSTR
:nullで終わるTCHAR
の文字列(LongPointer)LPCTSTR
:TCHAR
のヌルで終わる定数文字列(LongPointer)そう
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ Text Char( archive.is )
ジョンとティムの答えに追加します。
Win98用にコーディングしている場合を除き、アプリケーションで使用する必要がある6+文字列型は2つだけです。
LPWSTR
LPCWSTR
残りは、ANSIプラットフォームまたはデュアルコンパイルをサポートするためのものです。それらはかつてほど関連性がありません。
質問の2番目の部分に答えるには、次のようなことをする必要があります
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
mSのLVITEM
構造体にはLPTSTR
、つまりmutableT文字列ポインターがあり、LPCTSTR
ではないためです。あなたがしているのは
1)string
(推測でCString
)をLPCTSTR
に変換します(実際には、その文字バッファーのアドレスを読み取り専用ポインターとして取得することを意味します)
2)const
- nessをキャストすることにより、その読み取り専用ポインターを書き込み可能なポインターに変換します。
dispinfo
の呼び出しがListView
を介してwriteを試行する可能性があるかどうかに応じて、pszText
がどのように使用されるかによって異なります。もしそうなら、これは潜在的に非常に悪いことです:結局、あなたは読み取り専用のポインタを与えられ、それを書き込み可能として扱うことに決めました:たぶんそれが読み取り専用である理由があるのでしょう!
CString
を使用している場合は、string.GetBuffer()
を使用するオプションがあります。これは、意図的に書き込み可能なLPTSTR
を提供します。文字列が変更された場合は、ReleaseBuffer()
を呼び出すことを忘れないでください。または、ローカルの一時バッファを割り当てて、そこに文字列をコピーできます。
これは99%の時間で不要であり、LPCTSTR
をLPTSTR
として扱うことは機能します...