2011-03-29 21 views
3

私は、次のコードをしようとしている:WINAPI:編集のテキストをstd :: stringに取得する方法は?

int length = SendMessage(textBoxPathToSource, WM_GETTEXTLENGTH, 0, 0); 
LPCWSTR lpstr; 
SendMessage(textBoxPathToSource, WM_GETTEXT, length+1, LPARAM(LPCWSTR)); 
std::string s(lpstr); 

をしかし、それは動作しません。あなたは絶対に間違ってそれを使用している

+0

こんにちはどのような長さ変数値はありますか? –

答えて

4

まず、あなたの代わりに、ここで値の型を渡している:文字列への書き込みWinAPIの機能のインタフェース
SendMessage(textBoxPathToSource, WM_GETTEXT, length+1, LPARAM(LPCWSTR));

はSTD以来、バッファが必要です:: stringは直接書き込むことはできません。 値を保持するスペースを定義する必要があります。
WCHAR wszBuff[256] = {0};(もちろん、新しいものを使用してストレージスペースを割り当てることはできませんでしたが、LPCWSTR lpstrと宣言しました)。
はそのバッファ内の文字列や店舗を抽出:
SendMessage(textBoxPathToSource, WM_GETTEXT, 256, (LPARAM)wszBuff);
std::wstring s(lpStr)を行います。

EDIT: std :: stringではなくstd :: wstringの使用に注意してください。 ALevyが言っ

+0

詳細な返信をありがとうございます。しかし、std :: stringに変換するときにこのエラーが発生します: "WCHAR [256]からconst std :: basic_stringに変換できません"。そしてstd :: string s(lpStr)ではなくstd :: string s(w​​szBuff)を意味しましたか? – Alex

+1

あなたはそうです、私の版をご覧ください。 –

+0

ありがとう!出来た。私は.NET開発者ですが、この1つのプログラムにWINAPIを使用する必要があります。あなたは私を保存しました:) – Alex

0

は正しいですが、固定サイズのバッファよりstd::vector<WCHAR>(またはnewを使用)を使用する方が良いと思います:

std::wstring s; 
int length = SendMessageW(textBoxPathToSource, WM_GETTEXTLENGTH, 0, 0); 
if (length > 0) 
{ 
    std::vector<WCHAR> buf(length + 1 /* NUL */); 
    SendMessageW(textBoxPathToSource, 
       WM_GETTEXT, 
       buf.size(), 
       reinterpret_cast<LPCWSTR>(&buf[0])); 
    s = &buf[0]; 
} 
関連する問題