Считать данные из грида другого приложения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Считать данные из грида другого приложения

Сообщение Алексей К. » 27.12.2007 (Чт) 13:48

есть приложение написанное на дельфи, интерфейс - mdi, в дочернем окне есть табличка(грид, класс: TStringGrid). Возможно ли написать на vb прогу которая найдет нужное нам дочернее окно и циклом пройдется по строкам и столбцам грида?
думаю делать так, поправте если где ошибусь:
1) найду hwnd приложение по заголовку основной формы через FindWindow
2) найду дочернюю форму по её caption через FindWindowEx
3) как дальше обратиться к гриду и пройтись по нему?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 27.12.2007 (Чт) 14:30

Документированно - никак.
Но выход, конечно, есть.

Сомневаюсь, что StringGrid поддерживает оконные сообщения, с помощью которых (по аналогии с многострочным TextBox'ом) можно вытащить текст. Так что этот вариант можно отложить.

Тебе нужно в памяти целевого процесса отыскать указатель на метод StringGrid.Cells. Отыскать сложно, но включив смекалку можно придумать пару способов. Далее необходимо внедриться в процесс и там вызывать этот метод по указателю, передавая данные обратно.

Задача не тривиальная, поэтому готового сэмпла, естественно, не выкладываю.
Как начнутся праздники - появится немного свободного времени и если звезды удачно сложатся, то может что-нить и напишу.
А я все практикую лечение травами...

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 27.12.2007 (Чт) 14:54

спасибо буду надеятся что звезды удачно сложаться :)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 27.12.2007 (Чт) 14:59

На звезды надейся, да сам не плошай.
Что мешает самому попробовать?
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.12.2007 (Чт) 14:59

Twister, только указатель надо найти не на грид вообще, а на конкретный инстанс грида. И у меня сомнения есть по тому, что этот метод можно будет вызвать из другого процесса.
Lasciate ogni speranza, voi ch'entrate.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 27.12.2007 (Чт) 16:01

Twister писал(а):На звезды надейся, да сам не плошай.
Что мешает самому попробовать?

конечно попробую и ни что не мешает, я просто не программист - а любитель, с win api почти не работал. задачка не из простых оказалась :(

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.12.2007 (Пт) 6:46

Вчера, вкурив хорошей травы и залив все это дело добрым пивом, я решил "внимательнее изучить" твою проблему...

Итак, нам нужен адрес функции TStringGrid.GetCells в памяти целевого процесса. Для этого необходимо провести поиск в секции CODE по заранее подготовленной сигнатуре. Границы секции в памяти можно установить распарсив PE-файл процесса на диске. Сигнатурой может служить код всей функции, благо он не шибко большой (так поиск выйдет надежнее).

В эту функцию передается четыре параметра. Она имеет тип вызова fastcall - следовательно параметры передаются через регистры (первые три, остальные через стек) в следующей последовательности:
Первый - указатель на экзэмпляр соответствующего класса TStringGrid (регистр EAX)
Второй - Номер столбца начиная с нуля (регистр EDX)
Третий - Номер строки начиная с нуля (регистр ECX)
Четвертый - (выходной параметр) Заполняется адресом возвращаемой строки (стек)

После того, как найдем адрес TStringGrid.GetCells, необходимо найти указатель на нужный экзэмпляр класса TStringGrid. Следует отталкиваться от хэндла окна грида. Хэндл нужно искать в памяти процесса, не принадлежащей ни одному образу PE-файла, ибо эта память выделяется динамически. Найдя нужный DWORD, следует от полученного адреса отнять 180h и указатель на класс готов. ;) Конечно, гарантировать что мы нашли именно хэндл, а не какой-то мусор, просто так нельзя. Тут поможет тот факт, что по смещению 8h от начала записи о классе должен лежать указатель на имя грида (ASCII). Это нам и нужно проверить, мы ведь знаем, что имя компонента в Делфях состоит только из латинских символов, не содержит пробелов и длиной максимум 255 байт.
Думаю, реализовав все вышеописанное, определить количество строк и столбцов в сетке труда не составит...

Теперь, предварительно внедрившись в АП целевого процесса, можно вызывать TStringGrid.GetCells и ловить результат на стеке. Если результат равен пустой строке, то на стек ложится ноль.

Данные в свой процесс я бы рекомендовал передавать через файл-маппинг.

Эксперименты я ставил на Delphi7 под Вистой. На других версиях не проверял.

Что еще сказать? Метод, конечно, черезжопный. И, скорее всего, нет-нет будет глючить из-за ненадежности поиска. Но на первых порах сойдет. Короче, можешь попробовать, если не жалко потраченные силы на такую задачу...
А я все практикую лечение травами...

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 28.12.2007 (Пт) 7:44

спасибо большое за ответ, но признаюсь - это мне не позубам :) в данный момент не располагаю большим запасом времени для губокого изучения каждого этапа возможного решения.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.12.2007 (Пт) 11:10

Начни постепенно - запасись пивом и все получится... :)
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 39

    TopList