Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
3-101150
VMat
2002-10-10 00:08
2002.10.31
Как создать таблицу DBase III+ c полем NUMERIC 6.0


14-101469
Сергей Суровцев
2002-10-10 16:15
2002.10.31
Сюда, счастливчики!


3-101114
gepard
2002-10-08 20:35
2002.10.31
Не могу подконектится к Oracle


1-101308
bobby
2002-10-19 17:28
2002.10.31
как показать скроллбар в richedit?


1-101275
iNew
2002-10-21 21:22
2002.10.31
Модем в Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский