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

Вниз

Экспорт информации из другой программы.   Найти похожие ветки 

 
DanilinS   (2006-07-07 08:39) [0]

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

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

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


 
DanilinS   (2006-07-07 16:03) [1]

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

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


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


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


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


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

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


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

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


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


> DanilinS   (11.07.06 08:45) [3]


cм. [4]

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


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

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


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


> DanilinS   (11.07.06 10:49) [6]


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


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

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


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


> DanilinS   (11.07.06 13:16) [8]


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


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

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

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


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

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


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


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


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

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 16:48) [13]

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


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

А 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 нужно. Надо внедряться.



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

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

Наверх




Память: 0.5 MB
Время: 0.05 c
3-1159181529
kaif
2006-09-25 14:52
2006.11.26
Как в ADO SQL-запросе указать дату?


11-1139397561
Igi
2006-02-08 14:19
2006.11.26
KOLHilightEdit в Delphi IDE


2-1162978186
Megabyte
2006-11-08 12:29
2006.11.26
Как программно задавать/изменять системные переменные...


2-1163097500
Mr tray
2006-11-09 21:38
2006.11.26
Как избежать мигания при прорисовке?


5-1144329234
Alex Romanskiy
2006-04-06 17:13
2006.11.26
Компоненты для работы с MySQL