Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 03:23   #11
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Проделав следущий эксперимент можно увидеть что строка пишется и читается нормально:
Код:
 
// в cpp
wcscpy(CharName, L"qwerty"); 

// в h
textBox1->Text = gcnew String(CharName);
А почему это при ReadProcessMemory берется адрес указателя на строку, а не сам указатель?
Так наверное надо:
ReadProcessMemory(phandle, (void*) addr, CharName, 32, 0);
Конечно при условии, что phandle - это реальный хендл процесса с правами на чтение, а по адресу addr лежит действительно юникодная строка, которую надо скопировать.
EUGY вне форума Ответить с цитированием
Старый 28.04.2012, 17:41   #12
AleGr
Пользователь
 
Регистрация: 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 ))
AleGr вне форума Ответить с цитированием
Старый 28.04.2012, 18:05   #13
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вы же сказали, что массив задан так:
wchar_t CharName[16]; // 32 байта
Имя массива и есть указатель.
И на что конкретно ругается студия
EUGY вне форума Ответить с цитированием
Старый 28.04.2012, 23:57   #14
AleGr
Пользователь
 
Регистрация: 26.04.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Вы же сказали, что массив задан так:
wchar_t CharName[16]; // 32 байта
Имя массива и есть указатель.
И на что конкретно ругается студия
Всё, студия больше не ругается) но зато в файл по-прежнему корректно выводит содержимое этой переменной, но в текстбокс не хочет =(
AleGr вне форума Ответить с цитированием
Старый 29.04.2012, 03:48   #15
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Всё, студия больше не ругается) но зато в файл по-прежнему корректно выводит содержимое этой переменной, но в текстбокс не хочет =(
Щас я ругаться начну..
Прям вот удивительно, ладно бы новичок, не знает что такое строки, и пишет хелловорд, задаваясь вопросом, что за фигня с его кодом.

Но у Вас то, расклад: VisualStudio 2010, C++/CLI, чтение/запись виртуальной памяти чужого процесса, запись ее в файл.
То есть предполагается подготовка.
Вы ведь должны, берясь за такой проект, знать, что существует такая вещь, как отладчик, что можно просмотреть состояние всех переменных в коде в любой момент времени.
Этот несчастный строковый буфер из 32 байт, можно секунд за десять обнюхать со всех сторон. Стоит только раскрыть в окне watch буфер. Может в него попадает не юникод, а анси-строки.
И тогда стоит просто сменить тип char CharName[32] и при вызове gcnew String(CharName) будет вызов другого перегруженного конструктора.
Потом, любая подобная строка должна быть нуль-терминирована, у Вас это так?
Может буфер сразу начинается с нулевых байтов и тогда, разумеется это будет считаться пустой строкой, несмотря на то что за первыми нулевыми байтами идет какой-то текст.

Извините, накипело, после ваших: студия "ругается", текстбокс "не хочет".
EUGY вне форума Ответить с цитированием
Старый 29.04.2012, 05:03   #16
AleGr
Пользователь
 
Регистрация: 26.04.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Щас я ругаться начну..
Или я объясняю не правильно, или вы не так понимаете...
По порядку: да, подготовка есть, но именно с WindowsForms я начал разбираться около недели назад)
У меня нет идей, как в отладчике эту несчастную переменную отследить сразу в двух файлах
Менять тип - исключено. Входные данные - 100% юникод и 100% не больше 16 символов. С нуль-символа она не начинается!!
В ТЕКСТОВЫЙ ФАЙЛ ВЫВОДИТСЯ КОРРЕКТНО, ТАК, КАК ЗАДУМАНО АВТОРОМ! А вот, с текстбоксом траблы =( По-моему, я это уже третий раз пишу...

зы. пробую
wcscpy(CharName, L"qwerty"); //.срр

String^ s= gcnew String(CharName); //.h
textBox2->Text+=s;

ну, не получается ничего. В файл выводится qwerty, а в текстбокс - пустая строка

Или утки высоко летают, или я собаку низко подкидываю... Может, переменные где-то не так объявил? Модификаторы там, мож, какие надо...

Последний раз редактировалось AleGr; 29.04.2012 в 05:08.
AleGr вне форума Ответить с цитированием
Старый 29.04.2012, 07:03   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
У меня нет идей, как в отладчике эту несчастную переменную отследить сразу в двух файлах
Вы же сказали это глобальная переменная.
Вот в файле .h есть процедурка нажатия кнопки. типа такого:
Код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    textBox1->Text = gcnew String(CharName);
}
Ставим курсор мышки на эту строку, жмем F9.
Появилась точка остановки, красная, слева.
Запускаем проект. Жмем кнопку. Заходит в эту процедуру, останавливается?
Нет? Вообще тогда разговор ни о чем.
Да? Тогда наводим мышку на CharName, и по всплывающей подсказке смотрим, что в ней. Есть данные? Нет?
Ставим точку останова еще и на ReadProcessMemory.
Запускаем заново, остановилось на ReadProcessMemory ?
В окошке "Контрольные значения" напишем имя переменной CharName.
Жмем F10, F11, пошагово проходим все инструкции, выясняя, что так модифицирует строку, поглядывая в контрольные значения.
Обычная рутина...

Последний раз редактировалось EUGY; 29.04.2012 в 07:05.
EUGY вне форума Ответить с цитированием
Старый 29.04.2012, 13:27   #18
AleGr
Пользователь
 
Регистрация: 26.04.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Вы же сказали это глобальная переменная.
Вот в файле .h есть процедурка нажатия кнопки. типа такого:
Код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    textBox1->Text = gcnew String(CharName);
}
Ставим курсор мышки на эту строку, жмем F9.
Появилась точка остановки, красная, слева.
Запускаем проект. Жмем кнопку. Заходит в эту процедуру, останавливается?
Нет? Вообще тогда разговор ни о чем.
Да? Тогда наводим мышку на CharName, и по всплывающей подсказке смотрим, что в ней. Есть данные? Нет?
Ставим точку останова еще и на ReadProcessMemory.
Запускаем заново, остановилось на ReadProcessMemory ?
В окошке "Контрольные значения" напишем имя переменной CharName.
Жмем F10, F11, пошагово проходим все инструкции, выясняя, что так модифицирует строку, поглядывая в контрольные значения.
Обычная рутина...
Спасибо) сразу же понял в чём прикол х)
Оказывается, Application::Run(gcnew Form1()); нужно было выполнять после чтения памяти :D Всё супер, разобрался
AleGr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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