1

WIN32を使用して文字列をリストボックスに送信する関数を作成しました

char data[] = "abcd";

addToList(hWnd,data);

void addToList(HWND hWnd,char data[] ){
  SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data);    
}

これを実行すると、リストボックスにデータが送信されますが、奇妙な文字で表示される問題があります。wchar_tも試しましたが、問題は引き続き発生します。

4

1 に答える 1

5

まず、API呼び出しでエラーをチェックする必要があります。API関数へのすべての呼び出しの戻り値を確認する必要があります。

そうは言っても、質問のコードを考えると、

SendMessage(GetDlgItem(hWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM)data); 

その結果、リストボックスに項目が追加された場合、それGetDlgItemは実際に有効なウィンドウハンドルを返し、data実際に有効なメモリを指していることを意味します。その場合、あなたが報告することの唯一の説明は、エンコードされたテキストが一致しなかったということです。

したがって、SendMessageマクロはに評価されると想定できSendMessageWます。また、ANSIエンコードされたテキストを渡すため、その不一致が症状を説明します。この関数は、テキストをUTF-16でエンコードされたものとして扱います。

明らかな解決策の1つは、SendMessageA代わりに使用することです。ただし、私の見解では、より良い解決策はUTF-16でエンコードされたデータを渡すことです。

wchar_t data[] = L"abcd";
....
void addToList(HWND hWnd, const wchar_t *data)
{
    SendMessage(GetDlgItem(hWnd,IDC_LISTBOX), LB_ADDSTRING, 0, (LPARAM)data);    
}

明らかに、あなたのコードは、冒頭で述べたエラーチェックを追加します。

于 2013-02-17T20:06:04.700 に答える