これが私のコードです:
char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);
は 1 に等しくstrlen(bufText)、唯一の文字
bufTextはリスト ビュー サブアイテムの最初の文字です。
ここで何が間違っていますか?
問題は、Unicode モード(VS2005 以降のデフォルト) でビルドしているためListView_GetItemText()、Unicode 文字列を送信していたことだと思いますが、タイプが(つまり、ANSI/MBCS 文字列) であるため、不一致があります。 (つまり、Unicode UTF-16 文字列)。bufTextchar*wchar_t*
の代わりに ANSI/MBCS 文字列 (引数)へのポインタを渡していたため、コンパイラがエラー メッセージを表示して助けてくれました。しかし、コンパイラーをリッスン
しようとする代わりに、間違った型キャストでそれをシャットダウンします(Unicode ビルドでは に展開されます)。char* bufTextwchar_t*
LPTSTRwchar_t*
では、なぜ1 文字だけを取得したのですか?
リスト ビュー コントロールに格納されている ( によって取得されるListView_GetItemText())テキストが であるとします"hello"。
メモリ内の Unicode 表現は次のとおりです。
68 00 65 00 6C 00 6C 00 6F 00 00 00
h e l l o NUL
(のための Unicode UTF-16 表現がhis 0x0068、 for eis 0x0065、 for lis 0x006C、 for oisであるため0x006F、0x0000は UnicodeNULターミネータです。)
しかし、上記のバイト シーケンスをANSI stringとして解釈すると、ANSI 文字列の (1 バイトの)ターミネータは(ASCII ) バイトの後の最初のバイトになるため、ANSI では次のようになります。NUL 0x000x68h
68 00 <---- ANSI stops at the *first* 0x00 byte
h \0
つまり"h"ANSI 文字列なので、最初の Unicode UTF-16 文字列の最初の文字を取得するだけです。
私のアドバイスは、最新のソフトウェアの Unicode ビルドに移行することです。
さらに、これらの生の C ライクな文字配列は最新の C++ ではありません。それらは例外セーフではなく、さらに返されたポインターなどに
手動で 注意を払う必要があります。delete[]
std::vectorstd::wstring
例えば
#include <vector> // for std::vector
....
//
// Allocate a vector of 256 wchar_t's (so use Unicode).
//
// (Note: Memory is automatically cleaned up in the destructor,
// no need for *manual* delete[].)
//
std::vector<wchar_t> bufText( 256 );
//
// Get text from the list-view control.
//
ListView_GetItemText
(
GetDlgItem(myWindow, MYLISTVIEW),
myInt,
1,
&bufText[0], // <--- pointer to first character in the buffer
bufText.size() // <--- size of the buffer, in wchar_t's
);