1

を使用して ListView サブアイテムのテキスト値を取得しようとしていますListView_GetItemText()
これが私のコードです:

char *bufText = new char[256];
ListView_GetItemText(GetDlgItem(myWindow, MYLISTVIEW), myInt, 1, (LPTSTR)bufText, 256);
myIntリストビューの行のインデックスです。

は 1 に等しくstrlen(bufText)、唯一の文字bufTextはリスト ビュー サブアイテムの最初の文字です。

ここで何が間違っていますか?

4

2 に答える 2

4

これが私のコードです:

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であるため0x006F0x0000は 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
);
于 2013-07-01T10:33:31.047 に答える
2

Unicode ビルドを使用していますが、(キャストを使用して) ANSI バッファーをコントロールに渡しています。から変更する:

char* bufText = new char[256];

に:

wchar_t* bufText = new wchar_t[256];

(または、特に ANSI を使用する場合LVM_GETITEMTEXTAは、マクロを使用するのではなく、メッセージを送信します)。

于 2013-07-01T09:30:39.727 に答える