Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Экспорт информации из другой программы. [D7, WinXP]


DanilinS ©   (2006-07-07 08:39:00) 

Нужна помощь. Есть программа стороннего производителя. На Delphi написана. Есть ряд данных, которые необходимо вытащить из программы. Все интересующие данные хранятся - в TVirtualStringTree.

Дескриптор этого обьекта получить не проблемма. Указатель на процесс - то-же легко.

Как забрать эти данные?
Есть правда одна статейка http://forex.kbpauk.ru/showflat.php/Cat/0/Number/91439/Main/82830но там более простой обьект ....


GrayFace   (2006-07-14 12:25:00) [1]

А TVirtualStringTree - это откуда? У меня его не наблюдается.

DanilinS   (07.07.06 16:03) [1]
Кто знает, как по Handle визуального обьекта выйти на сам обьект в памяти?

Возьми код из FindVCLWindow, из инициализации модуля Classes - там создаются 2 атома, ипользуй тот, который не зависит от hInstance. Создавай аналогично атом, только с ProcessId того процесса. Все это лучше делать, внедрившись в сабжевый процесс - просто работать с компонентом, как со своим.

atruhin ©   (11.07.06 9:23) [4]
Во первых у VST необходимые свойства не опубликованы, напрмиер GetNodeData.

Если они в protected, то создать пустого наследника и привести к нему.

DanilinS   (11.07.06 13:16) [8]
А почему при P:=GetWindowLong( h, GWL_WNDPROC); к чужому окну получаю ошибку 5 (отказано в доступе) ?

Очевидно, защита от дурака - чтобы люди, привыкшие к Win3.1 и те кто не знает об адресных пр-вах задумались. Да и для работы ни о чем не подозревающих программ 3.1 нужно. Надо внедряться.


Сергей М.   (2006-07-11 16:48:00) [2]

И с какова цель получения тобой адреса оконной процедуры ?
Он актуален в АП только того процесса, в контексте которого интересующее окно было создано.


DanilinS   (2006-07-11 16:42:00) [3]


> Врешь.
> Не может быть такой ошибки.


простенькая прога:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 h:THandle;
 MousePos:TPoint;
 Text: array [0..256] of Char;
 CB: longint;
begin
 GetCursorPos(MousePos);
 h:=WindowFromPoint(MousePos);
 Label1.Caption:=IntToStr(h);
 GetWindowText(h, text, 200);
 Label3.Caption:= text;
 GetClassName(h,text,255);
 Label6.Caption:= text;
 CB:=GetWindowLong(h, GWL_WNDPROC);
 Label7.Caption:=IntToStr(CB);
end;

Везде CP = 0 кроме окна самой проги. Если при CP = 0 вызвать GetLastError то он возвращает 5


Сергей М.   (2006-07-11 15:51:00) [4]

"Та прога" как минимум должна быть собрана точно в той же версии, что и твоя "тест-прога".


DanilinS   (2006-07-11 15:42:00) [5]

В общих чертах:
по моей тест-проге данные моего TVirtualStringTree лежат в оперативке по адресу начиная с $A23D74.
Там всё что нужно.
($A23D74) +$230 - NodeDataSize
($A23D74) +$2F8 - RootNodeCount
и т.д.

Вот как - бы найти этот адрес в той проге, откуда дернуть данные хочу ....


Сергей М.   (2006-07-11 13:42:00) [6]


> DanilinS   (11.07.06 13:16) [8]


Врешь.
Не может быть такой ошибки.


DanilinS   (2006-07-11 13:16:00) [7]

А почему при P:=GetWindowLong( h, GWL_WNDPROC); к чужому окну получаю ошибку 5 (отказано в доступе) ?


Сергей М.   (2006-07-11 11:35:00) [8]


> DanilinS   (11.07.06 10:49) [6]


DeDe - довольно серьезный продукт. Это отнюдь не "простенькая программа".
DeDe "умеет" распознавать несколько версий Делфи, для каждой конкретной версии DeDe работает с RTTI индивидуальным образом.


DanilinS   (2006-07-11 10:49:00) [9]

Версию я могу определить точно.  ( D7 -  :-) ) Что интересно, декомпилятор DeDe легко «потрошит» EXE-шник, восстанавливая информацию о модулях, объектах и классах. И их методах. Вплоть до названий. Значит информация о  объектах где-то есть.


Сергей М.   (2006-07-11 10:04:00) [10]


> DanilinS   (11.07.06 08:45) [3]


cм. [4]

+ программа стороннего производителя не обязана быть построена в той же версии Делфи, на которой ты собрался писать "простенькую программу с этим компонентом". Это означает, что предполагаемые тобой "смещения" не обязаны быть точно такими же.


atruhin   (2006-07-11 09:23:00) [11]

Не получится. Во первых у VST необходимые свойства не опубликованы, напрмиер GetNodeData. Т.е. вызвать их не получится. Во вторых данные в VST хранятся в произвольных местах, то есть в VST может хранится например индекс массива в котором зранятся данные, или номер записи БД. VST ничего не знает о данных и их месторасположении.


DanilinS   (2006-07-11 08:45:00) [12]

Пишешь простенькую программу с этим компонентом и определяешь, структуру и адреса хранения нужных данных. А потом по аналогии смотреть в чужом процессе. На 90 % внутри компонента инфа храниться по этому смещению. Единственная тонкость -  элементы компонента, создаваемые динамически в динамической памяти. Надо искать указатели на эти компоненты.


Сергей М.   (2006-07-10 11:36:00) [13]


> по какому адресу этот компонент сидит в адресном пространстве


Предположим, этот адрес ты получил.
Что дальше ?
Где, по-твоему, располагается та самая "необходимая информация" относительно полученного адреса расположения экземпляра объекта класса TVirtualStringTree ?


DanilinS   (2006-07-07 16:03:00) [14]

Идея такова:
при помощи ReadProcessMemory я могу вытащить всю необходимую информацию, но мне надо знать, по какому адресу этот компонент сидит в адресном пространстве. :-(

Кто знает, как по Handle визуального обьекта выйти на сам обьект в памяти?


Наверх

Титульная страница Поиск, карта сайта Написать письмо