Форум: "WinAPI";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизКак получить по хэндлу адрес объекта в памяти? Найти похожие ветки
← →
Константин (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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c