![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
Проделав следущий эксперимент можно увидеть что строка пишется и читается нормально:
Код:
Так наверное надо: ReadProcessMemory(phandle, (void*) addr, CharName, 32, 0); Конечно при условии, что phandle - это реальный хендл процесса с правами на чтение, а по адресу addr лежит действительно юникодная строка, которую надо скопировать. |
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 26.04.2012
Сообщений: 12
|
![]()
А почему это при ReadProcessMemory берется адрес указателя на строку, а не сам указатель?
Так наверное надо: ReadProcessMemory(phandle, (void*) addr, CharName, 32, 0); Конечно при условии, что phandle - это реальный хендл процесса с правами на чтение, а по адресу addr лежит действительно юникодная строка, которую надо скопировать.[/QUOTE] хендл - правильный. вот что я делаю: cout<<CharName; //Тут всё ок почему не ReadProcessMemory(phandle, (void*) addr, CharName, 32, 0); хотябы потому, что вижл студия на это ругается и требует &CharName )) |
![]() |
![]() |
![]() |
#13 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]()
Вы же сказали, что массив задан так:
wchar_t CharName[16]; // 32 байта Имя массива и есть указатель. И на что конкретно ругается студия ![]() |
![]() |
![]() |
![]() |
#14 |
Пользователь
Регистрация: 26.04.2012
Сообщений: 12
|
![]() |
![]() |
![]() |
![]() |
#15 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]() Цитата:
![]() Прям вот удивительно, ладно бы новичок, не знает что такое строки, и пишет хелловорд, задаваясь вопросом, что за фигня с его кодом. Но у Вас то, расклад: VisualStudio 2010, C++/CLI, чтение/запись виртуальной памяти чужого процесса, запись ее в файл. То есть предполагается подготовка. Вы ведь должны, берясь за такой проект, знать, что существует такая вещь, как отладчик, что можно просмотреть состояние всех переменных в коде в любой момент времени. Этот несчастный строковый буфер из 32 байт, можно секунд за десять обнюхать со всех сторон. Стоит только раскрыть в окне watch буфер. Может в него попадает не юникод, а анси-строки. И тогда стоит просто сменить тип char CharName[32] и при вызове gcnew String(CharName) будет вызов другого перегруженного конструктора. Потом, любая подобная строка должна быть нуль-терминирована, у Вас это так? Может буфер сразу начинается с нулевых байтов и тогда, разумеется это будет считаться пустой строкой, несмотря на то что за первыми нулевыми байтами идет какой-то текст. Извините, накипело, после ваших: студия "ругается", текстбокс "не хочет". ![]() |
|
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 26.04.2012
Сообщений: 12
|
![]()
Или я объясняю не правильно, или вы не так понимаете...
По порядку: да, подготовка есть, но именно с WindowsForms я начал разбираться около недели назад) У меня нет идей, как в отладчике эту несчастную переменную отследить сразу в двух файлах Менять тип - исключено. Входные данные - 100% юникод и 100% не больше 16 символов. С нуль-символа она не начинается!! В ТЕКСТОВЫЙ ФАЙЛ ВЫВОДИТСЯ КОРРЕКТНО, ТАК, КАК ЗАДУМАНО АВТОРОМ! А вот, с текстбоксом траблы =( По-моему, я это уже третий раз пишу... зы. пробую wcscpy(CharName, L"qwerty"); //.срр String^ s= gcnew String(CharName); //.h textBox2->Text+=s; ну, не получается ничего. В файл выводится qwerty, а в текстбокс - пустая строка Или утки высоко летают, или я собаку низко подкидываю... Может, переменные где-то не так объявил? Модификаторы там, мож, какие надо... Последний раз редактировалось AleGr; 29.04.2012 в 05:08. |
![]() |
![]() |
![]() |
#17 | |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
![]() Цитата:
Вот в файле .h есть процедурка нажатия кнопки. типа такого: Код:
Появилась точка остановки, красная, слева. Запускаем проект. Жмем кнопку. Заходит в эту процедуру, останавливается? Нет? Вообще тогда разговор ни о чем. Да? Тогда наводим мышку на CharName, и по всплывающей подсказке смотрим, что в ней. Есть данные? Нет? Ставим точку останова еще и на ReadProcessMemory. Запускаем заново, остановилось на ReadProcessMemory ? В окошке "Контрольные значения" напишем имя переменной CharName. Жмем F10, F11, пошагово проходим все инструкции, выясняя, что так модифицирует строку, поглядывая в контрольные значения. Обычная рутина... Последний раз редактировалось EUGY; 29.04.2012 в 07:05. |
|
![]() |
![]() |
![]() |
#18 | |
Пользователь
Регистрация: 26.04.2012
Сообщений: 12
|
![]() Цитата:
Оказывается, Application::Run(gcnew Form1()); нужно было выполнять после чтения памяти :D Всё супер, разобрался |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
wchat_t to System::String^ | AleGr | Visual C++ | 0 | 26.04.2012 18:30 |
string-char-wchar_t-char-string чето потерял | magog7 | Общие вопросы C/C++ | 0 | 08.08.2011 20:21 |
Конвертирование из const char*(System::String) в LPCWSTR | Eros | Общие вопросы .NET | 1 | 27.05.2010 12:36 |
DWORD to System::String | Eros | Общие вопросы C/C++ | 1 | 13.05.2010 18:52 |
Преобразование из System::String в wchar_t* | AxenicX | Общие вопросы .NET | 2 | 16.02.2010 22:31 |