Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получение данных из TDBGrid - C++ WinAPI


Автор: Boltina 27.12.2016, 09:12
Есть стороннее приложение в нём в TDBGrid выводятся данные. Могу ли я с помощью winapi своим приложение получить эти данные? Сейчас получилось получить окно этого приложения. И посылать некоторые сообщения самому DBGrid'у.
Куда дальше копать, есть ли возможность получить данные? Какие варианты есть?

Автор: миг 27.12.2016, 10:25
Возможно существует ***.dll , которая может предоставить доступ к данным. 

Автор: GremlinProg 27.12.2016, 10:53
TDBGrid - есть в Delphi такой компонент. Если речь о нем, то будет довольно муторно получить его данные.
Здесь нужен тулсет для работы с объектами Delphi в памяти.
Проще наверное будет использовать не C++, а Delphi,
причем, желательно той же версии, на которой написано исходное приложение.

Автор: Boltina 27.12.2016, 12:29
Цитата(GremlinProg @ 27.12.2016,  10:53)
TDBGrid - есть в Delphi такой компонент. Если речь о нем, то будет довольно муторно получить его данные.
Здесь нужен тулсет для работы с объектами Delphi в памяти.
Проще наверное будет использовать не C++, а Delphi,
причем, желательно той же версии, на которой написано исходное приложение.

Очень похоже на Delphi. Возможность использовать Delphi вместо С++ есть, с версией проблема но подобрать нужную можно. 
Встает вопрос, а в delphi есть возможность получить доступ к TDBGrid сторонней программы? В какую сторону там смотреть?
Или использовать другой случай - влезать в память относящейся к этой программе?

Автор: GremlinProg 27.12.2016, 13:31
Цитата(Boltina @  27.12.2016,  14:29 Найти цитируемый пост)
Или использовать другой случай - влезать в память относящейся к этой программе? 

да, придется лезти в память чужого процесса, если TDBGrid не использует стандартные компоненты.
Это надо исходники посмотреть TDBGrid.

Насколько помню, такие компоненты даже если используют стандартные компоненты,
то работают с ними в режиме CUSTOM_DRAW, т.е. непосредственно строки хранят в своей памяти, а рисуют их через свои обработчики.
Либо имеют такой режим (virtual list/source как-то так называется).

Автор: миг 27.12.2016, 13:59
А не проще определить какие dll файлы были установлены с программой? Часто разработчики зашивают в dll специальные Api функции позволяющие сторонней программе работать с данными их программы.

Автор: GremlinProg 27.12.2016, 15:06
Цитата(миг @  27.12.2016,  15:59 Найти цитируемый пост)
А не проще определить какие dll файлы были установлены с программой? Часто разработчики зашивают в dll специальные Api функции позволяющие сторонней программе работать с данными их программы. 

конечно проще,
если есть API для приложения, лучше воспользоваться им и не заморачиваться

Автор: Boltina 27.12.2016, 16:27
Цитата(миг @ 27.12.2016,  13:59)
А не проще определить какие dll файлы были установлены с программой? Часто разработчики зашивают в dll специальные Api функции позволяющие сторонней программе работать с данными их программы.

обязательно посмотрю, если найду наверняка появятся вопросы: о результате напишу

Добавлено через 3 минуты и 17 секунд
Цитата(GremlinProg @ 27.12.2016,  13:31)
Цитата(Boltina @  27.12.2016,  14:29 Найти цитируемый пост)
Или использовать другой случай - влезать в память относящейся к этой программе? 

да, придется лезти в память чужого процесса, если TDBGrid не использует стандартные компоненты.
Это надо исходники посмотреть TDBGrid.

Насколько помню, такие компоненты даже если используют стандартные компоненты,
то работают с ними в режиме CUSTOM_DRAW, т.е. непосредственно строки хранят в своей памяти, а рисуют их через свои обработчики.
Либо имеют такой режим (virtual list/source как-то так называется).

TDBGrid, да кажется данные отдельно из компонента datasource или подобного.
А как понять что нет возможности работать именно с компонентом и с его datasource (при его наличии)

Автор: GremlinProg 28.12.2016, 07:37
Цитата(Boltina @  27.12.2016,  18:27 Найти цитируемый пост)
А как понять что нет возможности работать именно с компонентом и с его datasource (при его наличии) 

У меня нет исходников под рукой. Посмотрите в CreateParams, какой класс окна создается для контрола в TDBGrid или его предках (в TMemo, например - это класс EDIT)
Если ни какого, то смотрите, какие сообщения обрабатывает этот компонент. Вполне возможно, что можно получить необходимую Вам информацию через них (это API компонента).
В Delphi хорошо развито общение между компонентами через такие внутренние сообщения.

И только если ни чего из этого не помогает - можно пробовать получить данные.
Для начала - в одном адресном пространстве (в одном процессе).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)