Показать сообщение отдельно
  #1  
Старый 02.08.2013, 17:20
fora1983 fora1983 вне форума
Прохожий
 
Регистрация: 02.08.2013
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
Печаль Захват значения из памяти и преобразования его в текст

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
 StdCtrls, ComCtrls, ExtCtrls, Gauges;

type
  TForm1 = class(TForm)
      Gauge1: TGauge;
    Gauge2: TGauge;
    Edit1: TEdit;
    Edit2: TEdit;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Gauge3: TGauge;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

    private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  wideChars   : array[0..11] of WideChar;
  myString    : String;
  Form1: TForm1;
  i,rw:DWord;
  ch:WideChar;
  wch:array[0..255] of WideChar;
  KlientWindow:HWND; //Handle клиента
  ProcessId:Integer;
  hProcess:Integer; //Идентификатор объекта
  HPMinValue:Integer; //Минимальное значение ХП (из Edit1)
  MPMinValue:Integer; //Минимальное значение МП (из Edit2)
  L:Integer;           // уров
 // Nik:TListItem;          //ник
  M:Integer;           //бабло
  Nik : String;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  KlientWindow := FindWindow(nil, PChar('Perfect World')); //Находим Handle окна
  GetWindowThreadProcessId(KlientWindow,@ProcessId); //Получаем И.П.
  hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); //Открываем процесс с возможностью записи
  HPMinValue := StrToInt(Edit1.Text);
  MPMinValue := StrToInt(Edit2.Text);
  Timer1.Enabled := True;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var HP,HPMax,MP,MPMax:Integer;
    WHP,WHPMax,L,WMP,WMPMax,Lvl,Nikname,Nik,M,Money,Opit,O,Omax,Om,NoB:DWord;
begin
  try //На всякий случай заключаем в try...except, дабы в случай релога не засыпать пользователя ошибками
    ReadProcessMemory (hProcess, Pointer($00B9029C), @WHP, sizeof(WHP), NoB);
    ReadProcessMemory (hProcess, Pointer(WHP+$34), @WHP, sizeof(WHP), NoB);
    ReadProcessMemory (hProcess, Pointer(WHP+$0494), @WHP, sizeof(WHP), NoB); //Читаем значение HP
    HP := Integer(WHP); //Переводим Integer
    ReadProcessMemory (hProcess, Pointer($00B9029C), @WHPMax, sizeof(WHPMax), NoB);
    ReadProcessMemory (hProcess, Pointer(WHPMax+$34), @WHPMax, sizeof(WHPMax), NoB);
    ReadProcessMemory (hProcess, Pointer(WHPMax+$04DC), @WHPMax, sizeof(WHPMax), NoB); //Читаем значение MaxHP
    HPMax := Integer(WHPMax); //Переводим Integer
    ReadProcessMemory (hProcess, Pointer($00B9029C), @WMP, sizeof(WMP), NoB);
    ReadProcessMemory (hProcess, Pointer(WMP+$34), @WMP, sizeof(WMP), NoB);
    ReadProcessMemory (hProcess, Pointer(WMP+$0498), @WMP, sizeof(WMP), NoB); //Читаем значение MP
    MP := Integer(WMP); //Переводим Integer
    ReadProcessMemory (hProcess, Pointer($00B9029C), @WMPMax, sizeof(WMPMax), NoB);
    ReadProcessMemory (hProcess, Pointer(WMPMax+$34), @WMPMax, sizeof(WMPMax), NoB);
    ReadProcessMemory (hProcess, Pointer(WMPMax+$04E0), @WMPMax, sizeof(WMPMax), NoB); //Читаем значение MaxMP
    MPMax := Integer(WMPMax); //Переводим Integer
    Gauge1.Progress := round(HP * 100 / HPMax);  //Присваиваем процентное значение HP Gauge1
    Gauge2.Progress := round(MP * 100 / MPMax);  //Присваиваем процентное значение MP Gauge2
    ReadProcessMemory (hProcess, Pointer($00B9029C), @Lvl, sizeof(Lvl), NoB);
    ReadProcessMemory (hProcess, Pointer(Lvl+$34), @Lvl, sizeof(Lvl), NoB);
    ReadProcessMemory (hProcess, Pointer(Lvl+$048C), @Lvl, sizeof(Lvl), NoB);
    L := Integer(Lvl); //Переводим Integer
    Label1.Caption := IntToStr(L);
    ReadProcessMemory (hProcess, Pointer($00B9029C), @Money, sizeof(Money), NoB);
    ReadProcessMemory (hProcess, Pointer(Money+$34), @Money, sizeof(Money), NoB);
    ReadProcessMemory (hProcess, Pointer(Money+$0560), @Money, sizeof(Money), NoB) ;
    M := Integer(Money) ; //Переводим Integer
    Label4.Caption := IntToStr(M);

    ReadProcessMemory (hProcess, Pointer($00B9029C), @Nikname, sizeof(Nikname), NoB);
    ReadProcessMemory (hProcess, Pointer(Nikname+$34), @Nikname, sizeof(Nikname), NoB);
    ReadProcessMemory (hProcess, Pointer(Nikname+$0670), @Nikname, sizeof(Nikname), NoB);
    ReadProcessMemory (hProcess, Pointer(Nikname+$0), @Nikname, sizeof(Nikname), NoB);
    //Nik := Integer(Nikname); //Переводим Integer

   
    Label2.Caption := IntToStr (Nikname)   ;

   

    EXCEPT


  end;
end;

end.

начал писать программы захват из памяти числовых значений проходит успешно и они отображабся вот вывести в Label2 текстовое значение не получается выводится числовое значение в данном случае это 3342386. пробовались другие адреса памяти с текстом результат тот же набор цифр.
помогите пожалуйста
Ответить с цитированием