Перейти к содержанию

Помоги с отображение значений


Рекомендуемые сообщения

Delphi

Помогите мне сделать отображение указанного аддресса, в типе Double, 

Типо указал аддресс, и оно тебе из него значение пишет в ShowMessage;

вот код напилил, но всёравно не катит, 

[code/]

function Debugger(GameHandle: THandle; const Address: Pointer; ViewValue: Double): Integer;
var
  ReadValue: SIZE_T;
begin
  ReadProcessMemory(GameHandle, Address, @ViewValue, SizeOf(ViewValue), ReadValue);
end;
 
 
Ссылка на комментарий
Поделиться на другие сайты

Привет!

 

"Не катит" - в смысле, ничего не читает, или не получается потом на экран вывести полученное значение?

Не получается вывести
Ссылка на комментарий
Поделиться на другие сайты

Кенг, ты не понял наверн, FloatToStr. я взял чтобы просто попробовать, я не профи, просто как можно вывести в Edit, значение определённого аддресса в типе Double

я привёл функцию, которая возможно не пашет, даже проверить никак

Ссылка на комментарий
Поделиться на другие сайты

Переписал твою функцию:

function Debugger(GameHandle: THandle; const Address: Pointer): DWORD;var ReadValue: SIZE_T; ViewValue: DWORD;begin ReadProcessMemory(GameHandle, Address, @ViewValue, SizeOf(ViewValue), ReadValue); Result := ViewValue;end;
Вывод:

varAddressValue: DWORD;beginAddressValue := Debugger(...)Edit1.Text := IntToHEX(AddressValue, SizeOf(AddressValue));end;
Ссылка на комментарий
Поделиться на другие сайты

Не, это не то,

должно отображаться как на скриншоте, а не как в Edit, конечно спасибо что помогаете, но это не то/

dp20djjx.ipt_54b2340585bcc.png

Да, и пишу на XE, так что очень большое пожалуйста, не поправляйте код под 7

Ссылка на комментарий
Поделиться на другие сайты

Не, это не то,

должно отображаться как на скриншоте, а не как в Edit, конечно спасибо что помогаете, но это не то/

Значение отображается в HEX системе, все верно. Но я специально не написал вывод в обычном виде, т.к. из-за разных версий - код может тупо не работать. (мало-ли, какие-то методы убрали, переиначили... я за этим не слежу, мне это не интересно)

Но ради интереса можешь проверить:

Edit1.Text := Format('%.4d', [AddressValue]);
 

Да, и пишу на XE, так что очень большое пожалуйста, не поправляйте код под 7

Просто типы измени, в остальном - отличий быть не должно.
Ссылка на комментарий
Поделиться на другие сайты

Значение отображается в HEX системе, все верно.

 

Просто типы измени, в остальном - отличий быть не должно.

Всёравно не то!

тебе показывает в типе: 4 байта!, а нужно Double

hxa1ijoi.20l_54b23986a89ac.png

Изменено пользователем ∟DarkPan
Ссылка на комментарий
Поделиться на другие сайты

Всёравно не то!

тебе показывает в типе: 4 байта!, а нужно Double

hxa1ijoi.20l_54b23986a89ac.png

Но согласись: зато теперь функция точно работает, и значение точно выводится верное? Осталось только его вывести в нужном формате.

Можешь попробовать использовать ту же StrToFloat, ссылку на ее описание тебе скинул товарищ keng. Или попробуй в Real перегнать, он в D7 эквивалентен типу Double (как в XE - не знаю).

Вообще, я помню, где-то я видел такой классный метод, который свойственен как-раз для XE, который переводит из указанного типа - в указанный. К сожалению, я его как-то не принял во внимание, пока он мне не понадобился, но теперь я его найти не могу)

Ссылка на комментарий
Поделиться на другие сайты

Но согласись: зато теперь функция точно работает, и значение точно выводится верное? Осталось только его вывести в нужном формате. Можешь попробовать использовать ту же StrToFloat, ссылку на ее описание тебе скинул товарищ keng.

Вот теперь показывает это:

2,0047476E0009

А не это

1.62500044514339

===================

Код написал вот так:

[code/]

procedure TForm2.Button1Click(Sender: TObject);
var
  Address: DWORD;
begin
  GHandle := OpenProcess($001FFFFF, False, pID);
  Address := BlackScanner.Debugger(GHandle, Pointer($003E9468));
  Edit1.Text := FloatToStrF(Address, ffNumber, 8, 4);
end;
[code\]
Изменено пользователем ∟DarkPan
Ссылка на комментарий
Поделиться на другие сайты

Я так понимаю, что ты прочитал 8 байт (потому что тип - double), но они у тебя прочитаны в 16-ричной системе счисления, т.е. hexademical. Так что сначала тебе нужно преобразовать эти байты в нужный тебе тип (double), а уже затем - double в строку, воспользовавшись FloatToString (она работает и для float и для double). Возможно, в hex-double поможет PInt64(hex_num), но я не уверен, что эта функция есть в delphi xe7. Можешь написать байты, которые читаются из памяти? 16-ричные.

Ссылка на комментарий
Поделиться на другие сайты

Я так понимаю, что ты прочитал 8 байт (потому что тип - double), но они у тебя прочитаны в 16-ричной системе счисления, т.е. hexademical. Так что сначала тебе нужно преобразовать эти байты в нужный тебе тип (double), а уже затем - double в строку, воспользовавшись FloatToString (она работает и для float и для double). Возможно, в hex-double поможет PInt64(hex_num), но я не уверен, что эта функция есть в delphi xe7. Можешь написать байты, которые читаются из памяти? 16-ричные.

плин, я не понял то ничего, я просто хочу решить вопрос с отображением именно типа Double, а тут всё так запутанно

я пишу трейнера на ХЕ5 =/

есть такая функция:

qky2gopi.qo0_54b23f70ab2d2.png

Изменено пользователем ∟DarkPan
Ссылка на комментарий
Поделиться на другие сайты

Я в псевдокоде напишу, т.к. не пишу на дельфях:

 

У тебя три переменные - 8 байт (long word), double и string. Делаешь так:

hex_bytes;double;string; hex_bytes = ReadProcessMemory - читаешь 8 байт из нужного адреса памяти в переменную hex_bytesdouble = PInt64(hex_bytes) - используешь функцию PInt64, чтобы сконвертировать массив байт в тип doublestring = FloatToStr(double, 8, 4) - конвертируешь double в string при помощи FloatToStr
Ссылка на комментарий
Поделиться на другие сайты

 

Я в псевдокоде напишу, т.к. не пишу на дельфях:

 

У тебя три переменные - 8 байт (long word), double и string. Делаешь так:

hex_bytes;double;string; hex_bytes = ReadProcessMemory - читаешь 8 байт из нужного адреса памяти в переменную hex_bytesdouble = PInt64(hex_bytes) - используешь функцию PInt64, чтобы сконвертировать массив байт в тип doublestring = FloatToStr(double, 8, 4) - конвертируешь double в string при помощи FloatToStr

Напиши пожалуйста на дельфи, а то я C вообще не понимаю никак

Ссылка на комментарий
Поделиться на другие сайты

Я все понять не могу. В новых версиях Delphi есть тип Double. Если ты пишешь на новой XE, то зачем тебе преобразования? Сразу читай в Double, и преобразований не надо будет делать. Это в Delphi 7 приходится колдовать.

Ссылка на комментарий
Поделиться на другие сайты

Я все понять не могу. В новых версиях Delphi есть тип Double. Если ты пишешь на новой XE, то зачем тебе преобразования? Сразу читай в Double, и преобразований не надо будет делать. Это в Delphi 7 приходится колдовать.

Так как организовать в Double

я с таким дел не имел, а сейчас понадобилось! так что я незнаю как и чо сделать

Ссылка на комментарий
Поделиться на другие сайты

Так как организовать в Double

я с таким дел не имел, а сейчас понадобилось! так что я незнаю как и чо сделать

Понятия не имею, я в XE никогда не работал. Почитай про тип Double в новых Delphi. Думаю, что тебе в качестве выходного параметра функции нужно будет указать Double (как и все связанные переменные, если они действительно тебе станут нужны), а в качестве результата - брать значение по указателю. Например так как-нибудь:

Result := PDouble(@ViewValue)^;
Ссылка на комментарий
Поделиться на другие сайты

да ё маё, я уже замучался пля, сделайте мне пример

Изменено пользователем Xipho
Мат у нас запрещен, даже завуаливаронный. Устное предупреждение.
Ссылка на комментарий
Поделиться на другие сайты

NullAlex, оно не будет через ReadProcessMemory читать сразу Double, оно будет читать байты. Байты нужно преобразовать в Double после прочтения, а уже Double - в текстовую строку.

 

Автор, что тебе не понятно из комментариев в моем предыдущем посте? Вроде бы понятно написано.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Ребят, вы чего, смеетесь, что ли? Приведение типов когда отменили уже? Берешь переменную типа double, подсовываешь ее адрес функции ReadProcessMemory в качестве буфера для считывания данных, и все. Вот и готова переменная. А как вывести в поле ввода - NullAlex уже писал выше.

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.