∟DarkPan Опубликовано 10 января, 2015 Поделиться Опубликовано 10 января, 2015 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; Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 10 января, 2015 Поделиться Опубликовано 10 января, 2015 Привет! "Не катит" - в смысле, ничего не читает, или не получается потом на экран вывести полученное значение? Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 10 января, 2015 Автор Поделиться Опубликовано 10 января, 2015 Привет! "Не катит" - в смысле, ничего не читает, или не получается потом на экран вывести полученное значение?Не получается вывести Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 10 января, 2015 Поделиться Опубликовано 10 января, 2015 А как пытаешься выводить? Покажи код. Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Edit1.text := FloatToStr(BlackScanner.Debugger(GameHandle, Pointer($0004000), а тут хз что писать);Ребятоки, ну помогите же вы! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Вот [тут] достаточно подробно описан синтаксис нужной функции. Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Кенг, ты не понял наверн, FloatToStr. я взял чтобы просто попробовать, я не профи, просто как можно вывести в Edit, значение определённого аддресса в типе Doubleя привёл функцию, которая возможно не пашет, даже проверить никак Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Переписал твою функцию: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; Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Не, это не то, должно отображаться как на скриншоте, а не как в Edit, конечно спасибо что помогаете, но это не то/ Да, и пишу на XE, так что очень большое пожалуйста, не поправляйте код под 7 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Не, это не то,должно отображаться как на скриншоте, а не как в Edit, конечно спасибо что помогаете, но это не то/Значение отображается в HEX системе, все верно. Но я специально не написал вывод в обычном виде, т.к. из-за разных версий - код может тупо не работать. (мало-ли, какие-то методы убрали, переиначили... я за этим не слежу, мне это не интересно)Но ради интереса можешь проверить:Edit1.Text := Format('%.4d', [AddressValue]); Да, и пишу на XE, так что очень большое пожалуйста, не поправляйте код под 7Просто типы измени, в остальном - отличий быть не должно. Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 (изменено) Значение отображается в HEX системе, все верно. Просто типы измени, в остальном - отличий быть не должно.Всёравно не то!тебе показывает в типе: 4 байта!, а нужно Double Изменено 11 января, 2015 пользователем ∟DarkPan Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Всёравно не то! тебе показывает в типе: 4 байта!, а нужно Double Но согласись: зато теперь функция точно работает, и значение точно выводится верное? Осталось только его вывести в нужном формате. Можешь попробовать использовать ту же StrToFloat, ссылку на ее описание тебе скинул товарищ keng. Или попробуй в Real перегнать, он в D7 эквивалентен типу Double (как в XE - не знаю). Вообще, я помню, где-то я видел такой классный метод, который свойственен как-раз для XE, который переводит из указанного типа - в указанный. К сожалению, я его как-то не принял во внимание, пока он мне не понадобился, но теперь я его найти не могу) Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 (изменено) Но согласись: зато теперь функция точно работает, и значение точно выводится верное? Осталось только его вывести в нужном формате. Можешь попробовать использовать ту же 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\] Изменено 11 января, 2015 пользователем ∟DarkPan Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Я так понимаю, что ты прочитал 8 байт (потому что тип - double), но они у тебя прочитаны в 16-ричной системе счисления, т.е. hexademical. Так что сначала тебе нужно преобразовать эти байты в нужный тебе тип (double), а уже затем - double в строку, воспользовавшись FloatToString (она работает и для float и для double). Возможно, в hex-double поможет PInt64(hex_num), но я не уверен, что эта функция есть в delphi xe7. Можешь написать байты, которые читаются из памяти? 16-ричные. Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 (изменено) Я так понимаю, что ты прочитал 8 байт (потому что тип - double), но они у тебя прочитаны в 16-ричной системе счисления, т.е. hexademical. Так что сначала тебе нужно преобразовать эти байты в нужный тебе тип (double), а уже затем - double в строку, воспользовавшись FloatToString (она работает и для float и для double). Возможно, в hex-double поможет PInt64(hex_num), но я не уверен, что эта функция есть в delphi xe7. Можешь написать байты, которые читаются из памяти? 16-ричные.плин, я не понял то ничего, я просто хочу решить вопрос с отображением именно типа Double, а тут всё так запутанноя пишу трейнера на ХЕ5 =/есть такая функция: Изменено 11 января, 2015 пользователем ∟DarkPan Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Вот теперь показывает это: 2,0047476E0009 А не это 1.62500044514339 Читай: попробуй в Real перегнать, он в D7 эквивалентен типу Double Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Читай:Как перегнать Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Я в псевдокоде напишу, т.к. не пишу на дельфях: У тебя три переменные - 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Я в псевдокоде напишу, т.к. не пишу на дельфях: У тебя три переменные - 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 вообще не понимаю никак Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Я все понять не могу. В новых версиях Delphi есть тип Double. Если ты пишешь на новой XE, то зачем тебе преобразования? Сразу читай в Double, и преобразований не надо будет делать. Это в Delphi 7 приходится колдовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 Я все понять не могу. В новых версиях Delphi есть тип Double. Если ты пишешь на новой XE, то зачем тебе преобразования? Сразу читай в Double, и преобразований не надо будет делать. Это в Delphi 7 приходится колдовать.Так как организовать в Doubleя с таким дел не имел, а сейчас понадобилось! так что я незнаю как и чо сделать Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Так как организовать в Doubleя с таким дел не имел, а сейчас понадобилось! так что я незнаю как и чо сделатьПонятия не имею, я в XE никогда не работал. Почитай про тип Double в новых Delphi. Думаю, что тебе в качестве выходного параметра функции нужно будет указать Double (как и все связанные переменные, если они действительно тебе станут нужны), а в качестве результата - брать значение по указателю. Например так как-нибудь:Result := PDouble(@ViewValue)^; Ссылка на комментарий Поделиться на другие сайты Поделиться
∟DarkPan Опубликовано 11 января, 2015 Автор Поделиться Опубликовано 11 января, 2015 (изменено) да ё маё, я уже замучался пля, сделайте мне пример Изменено 11 января, 2015 пользователем Xipho Мат у нас запрещен, даже завуаливаронный. Устное предупреждение. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 NullAlex, оно не будет через ReadProcessMemory читать сразу Double, оно будет читать байты. Байты нужно преобразовать в Double после прочтения, а уже Double - в текстовую строку. Автор, что тебе не понятно из комментариев в моем предыдущем посте? Вроде бы понятно написано. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 января, 2015 Поделиться Опубликовано 11 января, 2015 Ребят, вы чего, смеетесь, что ли? Приведение типов когда отменили уже? Берешь переменную типа double, подсовываешь ее адрес функции ReadProcessMemory в качестве буфера для считывания данных, и все. Вот и готова переменная. А как вывести в поле ввода - NullAlex уже писал выше. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения