Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.31;
Скачать: CL | DM;

Вниз

Как получить по хэндлу адрес объекта в памяти?   Найти похожие ветки 

 
Константин   (2002-09-15 00:11) [0]

Нужно следующее: Есть программа, написанная на Делфи. В ее главном окне в StringGrid"е находяться данные, которые мне нужно "вынуть" и обработать. Хэндл StringGrid"а я уже получил. Можно ли по этому хэндлу как-то получить адрес StringGrid"а? Хочется просто наложить на него TStringGrid и дальше работать, как обычно.

P.S. Исходников нет. :-(


 
Юрий Зотов ©   (2002-09-16 01:40) [1]

Получить адрес оконного компонента Delphi можно вызовом GetProp. Вот выдержка из TWinControl.CreateHandle:

SetProp(FHandle, MakeIntAtom(ControlAtom), THandle(Self));
SetProp(FHandle, MakeIntAtom(WindowAtom), THandle(Self));

Только адрес этот будет принадлежать чужому адресному пространству и поэтому "наложить на него TStringGrid" так просто не получится. Посмотрите ReadProcessMemory и статью Almaz"а на этом сайте о внедрении в чужой процесс.


 
Константин   (2002-09-17 21:12) [2]

Спасибо, посмотрел, но, к сожалению, ничего не понял. :-(
function GetProp(Wnd: HWnd; Str: PChar): THandle;
Считывает из списка свойств окон описатель соответствующих данных.
Wnd: Идентификатоp окна.
Str: Стpока (заканчивающаяся пустым символом) или атом.
Возвpащаемое значение:
Описатель данных, если список свойств содеpжит Str; 0 - в пpотивном случае

Что такое атом?
Как же мне при помощи этого получить указатель на объект по хэндлу?
P.S. "Внедрение в чужой процесс" изучаю...



 
Almaz ©   (2002-09-18 00:20) [3]

Пара функций GetProp/SetProp позволяет связать с окном некоторые данные. В Delphi эти данные - адрес компонента связанного с этим окном. Параметр Str в этих функциях служит для идентификации тех данных, которые вы хотите связать. В Delphi - это строка (точнее атом) вида "ControlOfsXXXXXXXXYYYYYYYY", где XXXXXXXX - это hInstance приложения в шестнадцатиричном виде, а YYYYYYYY - это Thread ID основного потока приложения в том же виде. hInstance - это величина, на 99% равная hInstance вашего приложения, а ThreadID можно получить если вам известен handle окна этого приложения используя GetWindowThreadProcessID.
Исходя их вышеизложенного, получаем:

var
AtomText: array[0..31] of Char;
H: THandle;
AlienThreadID: Integer;
AlienControlAtom: TAtom;

PObj: Pointer;
begin
H := FindWindow( ... ); // Ссылка на окно чужого приложения
if H <> 0 then
begin
AlienThreadID := GetWindowThreadProcessID(H, nil);
AlienControlAtom := GlobalFindAtom(
StrFmt(AtomText, "ControlOfs%.8X%.8X", [HInstance, AlienThreadID]));
P := Pointer(GetProp(H, MakeIntAtom(AlienControlAtom))); // Вот он указатель
end;
end;


Однако помните, что как сказал уважаемый Юрий Зотов, это адрес в ЧУЖОМ адресном пространстве, а поэтому, для его использования, необходимо туда внедряться.

Удачи.



Страницы: 1 вся ветка

Текущий архив: 2002.10.31;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
4-101577
EAlexander
2002-09-19 10:36
2002.10.31
Переменные окружения


1-101347
madcap
2002-10-21 02:14
2002.10.31
Правописание


1-101201
Демонов Е.В.
2002-10-21 14:14
2002.10.31
Вопрос про Реестр ?


7-101546
JAndrey
2002-08-21 11:34
2002.10.31
Как запрограммировать COM порт на скорость > 115200 бит/сек


14-101458
Th
2002-10-09 17:46
2002.10.31
Service Pask для D6