どう違いますかLPCSTR、LPCTSTRおよびLPTSTR?
なぜ我々はに文字列を変換するために、これを実行する必要がありますLV/ _ITEM構造体変数pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
どう違いますかLPCSTR、LPCTSTRおよびLPTSTR?
なぜ我々はに文字列を変換するために、これを実行する必要がありますLV/ _ITEM構造体変数pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
回答:
質問の最初の部分に答えるには:
LPCSTRconst文字列へのポインタです(LPはLong Pointerを意味します)
LPCTSTRconst TCHAR文字列へのポインタです(TCHARプロジェクトでUNICODEが定義されているかどうかによって、ワイド文字または文字になります)
LPTSTR(非const)TCHAR文字列へのポインタです
実際、過去にこれらについて話すときは、単純化のために「ポインタへのポインタ」句を省略しましたが、軌道上の明るさのレースで言及されているように、これらはすべてポインタです。
これは、C ++文字列を説明する素晴らしいcodeprojectの記事です(異なるタイプを比較するチャートについては、下の2/3を参照してください)。
extern "C"たCリンケージがある。それとは別に、そうです、「ポインタ」ビットか、C文字列としての特定の説明が必要です。
素早く汚い:
LP== LオングPの ointer。ポインタまたはchar *を考えてください
C= C onst、この場合、文字列がconstであって、ポインタがconstではないことを意味すると思います。
STRある文字列は、
これTは、コンパイルオプションに応じて、ワイド文字または文字(TCHAR)用です。
char:8ビット文字-基礎となるC / C ++データ型CHAR:のエイリアスchar-Windowsデータ型LPSTR:(L ong P ointer)の nullで終了する文字列CHAR LPCSTR:(L ong P ointer)の nullで終了する定数文字列CHAR wchar_t:16ビット文字-基礎となるC / C ++データ型WCHAR:のエイリアスwchar_t-Windowsデータ型LPWSTR:(L ong P ointer)の nullで終了する文字列WCHAR LPCWSTR:(L ong P ointer)の nullで終了する定数文字列WCHAR UNICODE定義によってTCHAR:WCHARUNICODEが定義されている場合のエイリアス。さもないとCHARLPTSTR:(L ong P ointer)の nullで終了する文字列TCHAR LPCTSTR:(L ong P ointer)の nullで終了する定数文字列TCHAR そう
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR→ テキスト文字 (archive.is)
ジョンとティムの答えに追加。
Win98用にコーディングしていない限り、アプリケーションで使用する必要がある6つ以上の文字列タイプは2つだけです。
LPWSTRLPCWSTR残りはANSIプラットフォームまたはデュアルコンパイルをサポートするためのものです。それらは、以前ほど重要ではありません。
std::string場合は、ASCIIベースの文字列であるため、回避し、std::wstring代わりに使用します。
*AWinAPI のバージョンをUTF-8コードページと互換性のあるものにすることに取り組んでいる今、それらは突然より関連性があります。; P
質問の2番目の部分に答えるには、次のようなことをする必要があります
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
MSのLVITEM構造体にはLPTSTR、つまり変更可能な T文字列ポインタがあり、LPCTSTR。あなたがしていることは
1)string(CString推測で)a をLPCTSTR(実際には文字バッファーのアドレスを読み取り専用ポインターとして取得することを意味しますます
2)const-nessをキャストして、読み取り専用ポインターを書き込み可能ポインターに変換します。
それはdispinfoあなたのListView呼び出しがそれを介して書き込もうとする可能性があるかどうかに使用されるものに依存しますpszText。もしそうなら、これは潜在的に非常に悪いことです:結局、あなたは読み取り専用のポインタを与えられて、それを書き込み可能として扱うことに決めました:多分それが読み取り専用だった理由があるかもしれません!
それがaである場合は、CString使用するオプションがあります。これstring.GetBuffer()により、意図的に書き込み可能になりLPTSTRます。ReleaseBuffer()文字列が変更された場合は、必ず呼び出すことを忘れないでください。または、ローカルの一時バッファを割り当てて、そこに文字列をコピーすることもできます。
99%の時間はこれが不要でありLPCTSTR、LPTSTR意志で動作するように扱われます...しかし、ある日、あなたがそれを最も期待しないとき...
xxx_cast<>()代わりに使用してください。
xxx_cast<>2つの異なるブラケットベースのキャストスタイルを混在させるのではなく、コードを使用したはずです。