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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2012, 20:11   #1
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
Радость Unicode to ANSI.

Здравствуйте.

Заранее хочу предупредить, что в программировании я ещё совсем зелёный, поэтому прошу отнестись с пониманием, если я задам "глупый" вопрос.

Вот в чём суть:
Захотел написать простенькое приложение для онлайн игры (что-то на подобии бота).
Чисто, ради собственного развития.

Необходимо получить значения основных игровых переменных (деньги, координаты положения персонажа, имя игрока и т.п.).
Написал ниже следующее:

Код:
procedure sk12;
var
PwHandle : Dword;
BytesCount, ipbuf : Dword;
Hp:dword;
processID: Cardinal;
wHandle, tHandle: Hwnd;

begin
wHandle := FindWindow(nil, 'Perfect World');
if wHandle <> 0 then
begin
  tHandle := GetWindowThreadProcessId(wHandle, @ProcessID);
  pwHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);

  ReadProcessMemory(PwHandle, ptr($A571E0), @ipbuf, sizeof(ipbuf), BytesCount);   //Базовый адрес игры
ReadProcessMemory(PwHandle, ptr(ipbuf+$1c), @ipbuf, sizeof(ipbuf), BytesCount); //+0x1C смещение 1
ReadProcessMemory(PwHandle, ptr(ipbuf+$34), @ipbuf, sizeof(ipbuf), BytesCount); // +0x34 смещение 2
ReadProcessMemory(PwHandle, ptr(ipbuf+StrToInt('$' + edit1.text)), @HP, sizeof(HP), BytesCount); //ячейка памяти с искомым значением.

ShowMessage(inttostr(HP));
CloseHandle(PwHandle); //Закрываем Handle
  end
else
 showmessage('Процесс не найден');
 end;
Хотя код и кривоват, но прекрасно находит числовые значения (деньги, дистанцию,ID игрока и проч.), однако не отображает Unicode строки.
Такие как: имя игрока, имена мобов и тому подобное. Проблема в том, что не получается перевести значение ячейки памяти в Ansi.

Пробовал вот так:

Код:
var
WideStr: Widestring;
WideCharPointer : PWideChar;

 ReadProcessMemory(PwHandle, ptr($A571E0), @ipbuf, sizeof(ipbuf), BytesCount);   //Базовый адрес игры
ReadProcessMemory(PwHandle, ptr(ipbuf+$1c), @ipbuf, sizeof(ipbuf), BytesCount); //+0x1C смещение 1
ReadProcessMemory(PwHandle, ptr(ipbuf+$34), @ipbuf, sizeof(ipbuf), BytesCount); // +0x34 смещение 2
ReadProcessMemory(PwHandle, ptr(ipbuf+ $66с), @HP, sizeof(HP), BytesCount);      //+0x66с - ник игрока

WideStr:= WideChar(HP);
WideCharPointer:= addr(WideStr[1]);
ShowMessage(WideCharPointer);
Но не получилось, вместо текста выдаёт вопросы.

Помогите с решением, заранее благодарен)
Denutrror вне форума Ответить с цитированием
Старый 18.08.2012, 20:57   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

версия Делфи?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.08.2012, 21:09   #3
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
По умолчанию

Пепел Феникса, Delphi7.
Denutrror вне форума Ответить с цитированием
Старый 18.08.2012, 22:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
Utf8ToAnsi(WideStr)
По идее должна сработать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 14:06   #5
Denutrror
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 59
По умолчанию

Stilet, не сработало.
Опять "?" выдаёт.
Denutrror вне форума Ответить с цитированием
Старый 19.08.2012, 15:25   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не исключено что это не юникод.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 16:31   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Виталий, скорее всего там широкие символы, чего ж ты к UTF8 прицепился?

Код:
W:WideString;
s:string;
begin
 SetLength(W,17);//задаем длину начальную, 16 под макс ник +1 под ноль.(хотя в пв помоему 8 символов на ник)
 ReadProcessMemory(pw,<указатель с которого читаем), @W[1], 17*2, BytesCount);
 SetLength(W,lstrlenW(@W[1]));
 s:=w;
как то так вроде.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2012, 17:11   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
скорее всего там широкие символы, чего ж ты к UTF8 прицепился?
Наверное я окончательно перестал различать UTF8 от широких символов
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2012, 17:44   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

UTF16 тоже юникод, но не каждый юникод UTF8.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.08.2012, 09:03   #10
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

В онлайн-играх разработчики любят применять широкие строки, нультерминированные... Если вопрос ещё актуален - вечерком могу скинуть функцию, которая читает их.
Применял в свое время для чтения таких строк из пакетов Lineage...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из ANSI в UNICODE Mrshilov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 06.08.2012 08:55
ANSI & UNICODE AD0 Общие вопросы Delphi 0 15.06.2011 09:21
unicode to ansi Евгений79 Общие вопросы Delphi 10 25.05.2011 22:04
Перекодировать файл в UTF-8->ANSI, ANSI -> UFT-8 Человек_Борща Общие вопросы Delphi 7 19.05.2011 18:47
Конвертировать строку из ANSI в UNICODE Миша Общие вопросы Delphi 8 28.12.2009 18:23