[ad_1]
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
ムムターズ・アリ
[ad_2]
コメント