Как мне прочитать память в строку?

Я уже пробовал использовать wchar_t и цикл for для чтения памяти wchar с помощью wchar, и это сработало. Рабочий код:

int cl = 20;
std::wstring wstr;
wchar_t L;
for (int i = 0; i < cl; i++) {
ReadProcessMemory(ProcHandle, (unsigned char*)Address, &L, 2, NULL);
Address += 2;
wstr.push_back(L);
}
std::wcout << wstr << std::endl;

Теперь, когда я пытаюсь использовать std :: wstring и читать прямо в нем, он не работает по какой-либо причине.

int cl = 20;
std::wstring L;
L.resize(cl); // could use reserve?
ReadProcessMemory(ProcHandle, (unsigned char*)Address, &L, cl*2, NULL);
std::wcout << L << std::endl;

Я решил использовать (cl * 2) в качестве размера, потому что wchar_t имеет размер 2 символа.

Я ожидал, что он напечатает wstring в wcout, но вместо этого он будет ошибаться чем-то похожим на Failed to read sequence

Примечание: я не могу использовать wchat_t [20], потому что позже я хочу, чтобы cl был динамическим.

Изменить: забыл сказать, что я на std c ++ 17


person Electro    schedule 30.08.2019    source источник
comment
потому что wchar_t имеет размер 2 символа. - Вы действительно уверены, что это действительно гарантировано?   -  person Jesper Juhl    schedule 30.08.2019
comment
Пожалуйста, укажите в вопросе точное сообщение об ошибке, а не что-то подобное   -  person 463035818_is_not_a_number    schedule 30.08.2019
comment
// could use reserve? Нет. Резерв на самом деле не увеличивает размер вашей строки. Вы все равно будете писать за пределами вашей строки (даже если вы знаете, что выделенная память подходит для этого). Например, данные могут быть неправильно скопированы, если вы сделаете копию L. Насколько ему известно, размер по-прежнему будет равен 0, поэтому он попытается скопировать 0 символов.   -  person François Andrieux    schedule 30.08.2019


Ответы (1)


std::vector<wchar_t> больше подходит для вашего случая.

&L - это адрес строкового объекта, а не строкового буфера. Вы хотите использовать &L[0], адрес первого wchar.

person S.M.    schedule 30.08.2019
comment
даже лучше, L.data() - person Guillaume Racicot; 30.08.2019
comment
.data() == лучше. - person Jesper Juhl; 30.08.2019
comment
Согласен. Но мы не знаем, какой C ++ используется OP. - person S.M.; 30.08.2019
comment
Под каким c ++ вы подразумеваете какой стандарт? Потому что он должен работать даже без C ++ 11. - person unlut; 30.08.2019
comment
@unlut ну да и нет. mutable .data() - это только C ++ 17, который необходим OP. - person Guillaume Racicot; 30.08.2019
comment
@GuillaumeRacicot Пожалуйста, поправьте меня, если я ошибаюсь, но он не меняет внутренний указатель. Он только пытается записать в уже выделенный буфер? Это как вектор ‹char› vec; vec.resize (1000); scanf (% s, vec.data ()); - person unlut; 30.08.2019
comment
@unlut .data() (для basic_string) возвращает указатель на const до C ++ 17. Поэтому для записи в него нужен указатель на изменяемые данные. - person Guillaume Racicot; 30.08.2019
comment
Это работает! Спасибо! Мне пришлось передать его на LPVOID (что, очевидно, не было большой задачей) - person Electro; 30.08.2019