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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2010, 08:46   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну вот, готово
Внедрение в процесс.zip
И главное запомните, переменные типа String, PChar, а так же динамические массивы хранят в себе указатель на начало данных, но их адресс сам по себе не является этим началом.
Sibedir вне форума Ответить с цитированием
Старый 16.09.2010, 09:12   #12
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Ну вот, готово
Вложение 29950
И главное запомните, переменные типа String, PChar, а так же динамические массивы хранят в себе указатель на начало данных, но их адресс сам по себе не является этим началом.
Прошу прощения за глупый вопрос, но как ей пользоваться?
xRamzeSx вне форума Ответить с цитированием
Старый 16.09.2010, 09:14   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Всмысле? Там 2 проекта.
Project1 - программа читающая данные из Project2.
Sibedir вне форума Ответить с цитированием
Старый 16.09.2010, 10:00   #14
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Возможно вы меня не так поняли. Начну с начала и по лесенке.
1) Есть игра, программа, утилита, не важно.
2) В этом приложении есть адрес, в котором есть текст, допустим xRamzeSx
3) Я хочу, чтобы программа, автоматически считывала это значение, из адреса и показывала в моей форме, по таймеру, напимер, вот скрин (Сделан в фотошопе) т.е хочу такой результат:

а получается, вот этот:
xRamzeSx вне форума Ответить с цитированием
Старый 16.09.2010, 10:05   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
В этом приложении есть адрес, в котором есть текст, допустим xRamzeSx
Ну. Берете адрес текста и считываете с помощью
Код:
read_string (adr, 30).
Sibedir вне форума Ответить с цитированием
Старый 16.09.2010, 11:06   #16
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Ну. Берете адрес текста и считываете с помощью
Код:
read_string (adr, 30).
Не хочу показаться назойливым, но не могли бы Вы выложить здесь код, с этой строкой и примерным адресом. Пожалуйста.
xRamzeSx вне форума Ответить с цитированием
Старый 16.09.2010, 11:16   #17
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

М-м-м, а в чем проблема? Вы не можете распоковать zip или не можете скачать 3КБ?

Цитата:
и примерным адресом
Этот адрес должны знать вы, а не я.

Вот часть кода нужного вам:
Project1
Код:
const
  WindowTitle = 'Нужное окошко';

implementation

function read_value (Address: Pointer; ASize: Cardinal; var AOut: Pointer): Cardinal;
var
  WindowH: DWORD;
  ThreadId: DWORD;
  ProcessId: DWORD;
  ProcessH: DWORD;
begin
  WindowH := FindWindow (nil, WindowTitle);
  ThreadId := GetWindowThreadProcessId (WindowH, ProcessId);
  ProcessH := OpenProcess (PROCESS_VM_READ, False, ProcessId);

  ReadProcessMemory(ProcessH, Address, AOut, ASize, Result);

  CloseHandle (ProcessH);
end;

function Read_Integer (Address: Pointer; ASize: Cardinal): Integer;
var
  buf: PInteger;
begin
  GetMem (buf, ASize);
  if read_value (Address, ASize, Pointer(buf)) = ASize then
    Result := buf^
  else
    Result := 0;
end;

function Read_Real (Address: Pointer; ASize: Cardinal): Real;
var
  buf: ^Real;
begin
  GetMem (buf, ASize);
  if read_value (Address, ASize, Pointer(buf)) = ASize then
    Result := buf^
  else
    Result := 0;
end;

function Read_String (Address: Pointer; ASize: Cardinal): String;
var
  buf: String;
begin
  SetLength (buf, ASize);
  if read_value (Address, ASize, Pointer(buf)) = ASize then
    Result := buf
  else
    Result := '<Не удалось>';
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i, Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edIntP.Text));
  Size := StrToInt (edIntS.Text);
  i := Read_Integer (Adr, Size);
  edInt.Text := IntToStr (i);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  r: Real;
  Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edRealP.Text));
  Size := StrToInt (edRealS.Text);
  r := Read_Real (Adr, Size);
  edReal.Text := FloatToStr (r);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s: String;
  Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edStrP.Text));
  Size := StrToInt (edStrS.Text);
  s := Read_String (Adr, Size);
  edStr.Text := s;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  s: String;
  Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edPCharP.Text));
  Size := StrToInt (edPCharS.Text);
  s := Read_String (Adr, Size);
  edPChar.Text := s;
end;
Project2
Код:
var
  Form1: TForm1;
  IntV: Integer;
  RealV: Real;
  StrV: String;
  PChV: PChar;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p: Pointer;
begin
  IntV := StrToInt (edInt.Text);
  p := @IntV;
  edIntP.Text := IntToStr (Integer (p));
  edIntS.Text := IntToStr (SizeOf (IntV));

  RealV := StrToFloat (edReal.Text);
  p := @RealV;
  edRealP.Text := IntToStr (Integer (p));
  edRealS.Text := IntToStr (SizeOf (RealV));

  StrV := edStr.Text;
  p := Pointer (StrV);
  edStrP.Text := IntToStr (Integer (p));
  edStrS.Text := IntToStr (Length (StrV));

  PChV := PChar (edPChar.Text);
  p := Pointer (PChV);
  edPCharP.Text := IntToStr (Integer (p));
  edPCharS.Text := IntToStr (Length (PChV));
end;

Последний раз редактировалось Sibedir; 16.09.2010 в 11:18.
Sibedir вне форума Ответить с цитированием
Старый 16.09.2010, 12:26   #18
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Этот код я смотрел
Просто я не знаю, что там где писать (к примеру этот адрес - $456B8C)
Мне кажется, что Project2 мне не понадобится, а вот если изменить вашу функцию, например, кнопки:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  s: String;
  Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edPCharP.Text));
  Size := StrToInt (edPCharS.Text);
  s := Read_String (Adr, Size);
  edPChar.Text := s;
end;
и сделать вот так:
Код:
procedure TTimer1.Timer(Sender: TObject);
var
  s: String;
  Size: Integer;
  Adr: Pointer;
begin
  Adr := Pointer (StrToInt (edPCharP.Text)); // Думаю, что edPCharP как Edit1
  Size := StrToInt (edPCharS.Text); // Думаю, что edPCharS как Edit2
  s := Read_String (Adr, Size); // Может быть вот так - ($456B8C, Size) {Size} не знаю, что вставить
  edPChar.Text := s; // Думаю, что edPChar как Edit3
end;
Поправьте меня, если я где-то ошибся, или что-то не туда написал.
И ещё,
Код:
Adr := Pointer (StrToInt (edPCharP.Text));
  Size := StrToInt (edPCharS.Text);
Зачем эти строки, если нужно только считывание?

Последний раз редактировалось xRamzeSx; 16.09.2010 в 13:17.
xRamzeSx вне форума Ответить с цитированием
Старый 16.09.2010, 13:08   #19
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Просто я не знаю, куда, что у там где писать (к примеру этот адрес - $456B8C)
Извините за прямоту, но вы еще походу и как писать не знаете. У меня правило. Хотите со мной общатся - соблюдайте минимальные правила речи. На подобные выражения, которые в русском (да думаю и в любом другом) языке не имеют смысловой нагрузки, я не отвечаю.

Продолжим.


xRamzeSx, ну а вы что думали, я прям вашу конкретную задачу вам решил. Я просто написал программу-пример.

Цитата:
Мне кажется, что Project2 мне не понадобится
Эт точно. Он нужен для работы Project1. Project2 - это и есть то самое 'Нужное окошко'.


Не зная, что у вас за Edit1. У меня edPCharP - эдит, в который нужно ввести адрес.
Не зная, что у вас за Edit2. У меня edPCharS - эдит, в который нужно ввести длину строки. Можете взять ее равную 100 или 200. Это не важно. ReadString всеравно должен вернуть строку нужного размера (до символа #0, коим заканчиваются строки).
Не зная, что у вас за Edit3. У меня edPChar - эдит, в который записывается результат.

Можно так:
Код:
procedure TTimer1.Timer(Sender: TObject);
begin
  edPChar.Text := Read_String ($FFFFFFFF{ваш адрес}, 200);
end;
Должон работать.
Sibedir вне форума Ответить с цитированием
Старый 16.09.2010, 13:20   #20
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию

Цитата:
Просто я не знаю, что там где писать
Я запечатался, и не заметил

Код:
procedure TTimer1.Timer(Sender: TObject);
begin
  edPChar.Text := Read_String ($FFFFFFFF{ваш адрес}, 200);
end;
Сейчас всё попробую, может получится

Последний раз редактировалось xRamzeSx; 16.09.2010 в 13:23.
xRamzeSx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл, содержащий текст, записанный строчными русскими буквами. Получить в др.файле тот же текст, develish151 Microsoft Office Word 4 05.05.2010 13:20
Натуральное число, в записи которого п цифр, называется числом Армстронга, если сумма его цифр, возведенн OTLi4HO Общие вопросы C/C++ 6 14.01.2009 19:48
Как узнать какой текст выделен в текст поле mogul82 JavaScript, Ajax 2 02.11.2008 16:32