web-dev-qa-db-ja.com

LPCSTR、LPCTSTR、およびLPTSTR

LPCSTRLPCTSTR、およびLPTSTRの違いは何ですか?

文字列をLV/_ITEM構造変数pszTextに変換するためにこれを行う必要があるのはなぜですか:

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
97
nothingMaster

質問の最初の部分に答えるには:

LPCSTRはconst文字列です

LPCTSTRconst TCHAR文字列です(TCHARは、UNICODEがプロジェクトで定義されているかどうかに応じてワイド文字または文字です)

LPTSTRは(非定数)TCHAR文字列です

これは素晴らしいです codeproject article C++文字列の説明(異なるタイプを比較するチャートについては2/3をご覧ください)

111
John Sibly

早くて汚い:

LP == L ong P ointer。ポインタまたはchar *を考える

C = C onst、この場合、文字列はconstであり、ポインターはconstではないことを意味すると思います。

STRstringです

Tは、コンパイルオプションに応じてワイド文字または文字(TCHAR)を表します。

82
Tim

8ビットAnsiString

  • char:8ビット文字-基になるC/C++データ型
  • CHARcharのエイリアス-Windowsデータ型
  • LPSTR:nullで終わるCHARの文字列LongPointer)
  • LPCSTRCHARのヌルで終わる定数文字列LongPointer)

16ビットUnicodeString

  • wchar_t:16ビット文字-基になるC/C++データ型
  • WCHARwchar_tのエイリアス-Windowsデータ型
  • LPWSTR:nullで終わるWCHARの文字列LongPointer)
  • LPCWSTRWCHARのヌルで終わる定数文字列LongPointer)

UNICODE defineに応じて

  • TCHAR:UNICODEが定義されている場合のWCHARのエイリアス。それ以外の場合はCHAR
  • LPTSTR:nullで終わるTCHARの文字列LongPointer)
  • LPCTSTRTCHARのヌルで終わる定数文字列LongPointer)

そう

| Item              | 8-bit        | 16-bit      | Varies          |
|-------------------|--------------|-------------|-----------------|
| character         | CHAR         | WCHAR       | TCHAR           |
| string            | LPSTR        | LPWSTR      | LPTSTR          |
| string (const)    | LPCSTR       | LPCWSTR     | LPCTSTR         |

ボーナスリーディング

TCHARText Chararchive.is

23
Ian Boyd

ジョンとティムの答えに追加します。

Win98用にコーディングしている場合を除き、アプリケーションで使用する必要がある6+文字列型は2つだけです。

  • LPWSTR
  • LPCWSTR

残りは、ANSIプラットフォームまたはデュアルコンパイルをサポートするためのものです。それらはかつてほど関連性がありません。

3
JaredPar

質問の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%の時間で不要であり、LPCTSTRLPTSTRとして扱うことは機能します...

3
AAT