WINAPI: как получить текст редактирования в std :: string? - PullRequest
3 голосов
/ 29 марта 2011

Я пытаюсь следующий код:

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

Но это не работает.

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Вы используете его абсолютно неправильно:

Сначала вы передаете тип вместо значения здесь:
SendMessage(textBoxPathToSource, WM_GETTEXT, length+1, LPARAM(LPCWSTR));

Интерфейс WinAPI-функций, которые пишут в строкутребует буфера, так как std :: string нельзя записывать напрямую.Вам нужно определить пространство для хранения значения:
WCHAR wszBuff[256] = {0}; (конечно, вы можете выделить место для хранения, используя new, что вы не сделали, вы только что объявили LPCWSTR lpstr).
Извлеките строку исохранить в этом буфере:
SendMessage(textBoxPathToSource, WM_GETTEXT, 256, (LPARAM)wszBuff);
и выполнить std::wstring s(lpStr).

РЕДАКТИРОВАТЬ: Обратите внимание на использование std :: wstring, а не std :: string.

0 голосов
/ 29 марта 2011

То, что сказал ALevy, правильно, но было бы лучше использовать 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...