Главная страница
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.01 c
4-101584
Super
2002-09-19 22:51
2002.10.31
Application.Handle других процессов


4-101568
Eugene
2002-09-18 13:59
2002.10.31
Наверное глупый вопрос, но все таки как


3-101066
BJValentine
2002-10-11 20:49
2002.10.31
Помогите...


1-101197
Freeze
2002-10-21 12:10
2002.10.31
Как работать с пометкой на удаление в базе


3-101109
dimonf
2002-10-09 18:51
2002.10.31
Как убрать из ячеек DBGrid-а ,букву