これが私のコードです:
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 文字列)。bufText
char*
wchar_t*
の代わりに ANSI/MBCS 文字列 (引数)へのポインタを渡していたため、コンパイラがエラー メッセージを表示して助けてくれました。しかし、コンパイラーをリッスン
しようとする代わりに、間違った型キャストでそれをシャットダウンします(Unicode ビルドでは に展開されます)。char* bufText
wchar_t*
LPTSTR
wchar_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 表現がh
is 0x0068
、 for e
is 0x0065
、 for l
is 0x006C
、 for o
isであるため0x006F
、0x0000
は UnicodeNUL
ターミネータです。)
しかし、上記のバイト シーケンスをANSI stringとして解釈すると、ANSI 文字列の (1 バイトの)ターミネータは(ASCII ) バイトの後の最初のバイトになるため、ANSI では次のようになります。NUL
0x00
0x68
h
68 00 <---- ANSI stops at the *first* 0x00 byte
h \0
つまり"h"
ANSI 文字列なので、最初の Unicode UTF-16 文字列の最初の文字を取得するだけです。
私のアドバイスは、最新のソフトウェアの Unicode ビルドに移行することです。
さらに、これらの生の C ライクな文字配列は最新の C++ ではありません。それらは例外セーフではなく、さらに返されたポインターなどに
手動で 注意を払う必要があります。delete[]
std::vector
std::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
);