【解決方法】cstring を LPCSTR に変換するときに最初の文字のみを返す理由

プログラミングQA


Cstring を LPCSTR に変換するときに最初の文字のみを返す理由

私が試したこと:

親愛なる男
以下のコードで Cstring を LPCSTR に変換しています

C++
CString strData1 = L"ABCDE";
LPCSTR spData = (LPCSTR)(LPCTSTR)strData1;
MessageBox(NULL, strData1, L"CString strData", MB_OK);      //=> ABCDE
MessageBox(NULL, (CString)spData, L"LPCSTR spData", MB_OK); //=> A  (What's problem)

なぜ LPCSTR spData は A (の最初の文字 Cstring strData1)

解決策 1

キャストを使用してデータをある型から別の型に変換することはできません。 見る WideCharToMultiByte 関数 (Windows)[^]

解決策 2

すでに述べたように、キャストではなく変換が必要です。 の CString クラスはあなたのためにそれを行うことができます:

// Your code assumes a Unicode build and this example too

CString strData1 = L"ABCDE";

// Create a CStringA. 
// The conversion from Unicode to ANSI is done by the CString class.
// May also use CStringA strData1A(strData1);
CStringA strData1A = strData1;

// Get a LPCSTR from the CStringA
LPCSTR spData = strData1A.GetString();

MessageBox(NULL, strData1.GetString(), L"CString strData", MB_OK);

// Create a CString (CStringW) from a LPCSTR with conversion
MessageBox(NULL, CString(spData).GetString(), L"LPCSTR spData", MB_OK);

また、C スタイルのキャストの使用も避ける必要があります。 代わりに C++ キャスト演算子を使用します ( 型変換 – C++ チュートリアル[^] と キャスティングオペレーター[^])。

解決策 3

もう1つ、関数チェックを使用している場合、Unicode用の関数も必要です..

レジストリのように機能があります

RegCreateKeyExA

しかし、ユニコードの場合、同じ関数の別のバージョンが呼び出されます

RegCreateKeyExW

ムムターズ・アリ

コメント

タイトルとURLをコピーしました