WinAPI рулит |
Настроение сейчас - Зашибенное
Есть в программе Башфин такая очень мелкая особенность, но для меня - очень важная. Есть в программе Башфин статусбар. Статусбар как статусбар, в меру бесполезная штука. Но! Когда пользователь проделывает какие-либо операции, внизу в статусбаре начинает резко-резко обновлятся заголовок. Приглядевшись, я заметил, что там мелькают обрывки запросов к БД.
Но эти обрывки пишутся очень-очень часто и поймать строчку взглядом можно лишь искусственно вызвав сообщение об ошибке. Однако у меня уже есть огромный опыт программирования в WinAPI, и я знаю, что ловить строчку в статусбаре можно не только взглядом. =D
Для тех кто не знает о чем идет речь, подскажу: WinAPI это Windows Application Programming Interface, то есть инструменты для создания приложений под Windows. С точки зрения системы Windows программа может содержать одно или несколько окон, каждое окно имеет оконную функцию, которая обрабатывает приходящие этому окну сообщения. Сообщиями обмениваются друг с другом все окна в системе Windows и с помощью этих сообщений, собственно, окном можно управлять: изменять или считывать текст в заголовке окна, менять размеры, форму, двигать окна, прятать или показывать их и т.д.
Также в системе Windows есть такое понятие как ловушка (hook). Ловушка навешивается на определенный тип сообщений, имеет идентификатор в системе и собственную функцию, которая, в-общем-то может делать с сообщением что угодно и реагировать на него как угодно.
Это не все возможности WinAPI, но в данном случае это все, что мне необходимо. :)
Первоначально идея была такая - Написать основную программу и dll с ловушкой. Основная программа бы подключала динамическую библиотеку и запускала бы ловушку на сообщение WM_SETTEXT, после чего каждый раз как только статусбар Башфиновской программы получал бы приказ на изменение заголовка, ловушка перехватывала бы текст заголовка и перенаправляла бы его на основную программу, а основная программа уже выводила бы полученный текст в список или сразу же записывала бы в файл.
Однако в процессе программирования возникла неожиданная проблема. Сообщение WM_SETTEXT не ловилось, как будто его нет. Поэкспериментировав с другими окнами, я предположил, что возможно проблема заключается во внутреннем устройстве Башфина (внутреннюю структуру библиотеки MFC я знаю лишь примерно, чисто теоретически). Это конечно, хреново, но мне удалось обойти эту проблему: я поставил ловушку не на сообщение WM_SETTEXT, а на WM_PAINT. Теперь основная программа, каждый раз получив информацию о перерисовке статусбара, считывает заголовок статусбара. Способ не очень хороший, однако мне удалось добится кое-каких результатов. :)
Вот вам для примера обрывок "истории" изменения текста статусбара при модификации одного из ПБС:
A1 04/02/2009 19:58:14 АСФР Админ
select account,nvl(type,0),typeName,bank,baccount,text,budget_pack.getAuthor username,chdate),modstatus,m_finobjectGroup,m_finobject,m_Account, accMode,SEND_UIC,RECV_UIC from budget_account_view where year=:y AND finorgan=:f AND finobjectGroup=:g AND finobject=:o order by year,finorgan,finobjectGroup,finobject,account
A1 05/02/2009 14:28:30 АСФР Админ
select RCOG,type from budget_finobject_view where year=:y and finorgan=:f and finobject=:fo
A1 05/02/2009 14:28:30 АСФР Админ
select count(*) from budget_account_view where year=:y and finorgan=:f and finobject=:fo and type=12
A1 05/02/2009 14:28:30 АСФР Админ
select caccountowner,rcog from budget_finobject_view where year=:y and finorgan=:f and finobject=:fo
A1 05/02/2009 14:28:30 АСФР Админ
select caccountintime from budget_finobject_view where year=:y and finorgan=:f and finobject=:fo
A1 05/02/2009 14:28:30 АСФР Админ
select finobjtype,name from budget_finobjectType_view where year=:y order by finobjType
A1 05/02/2009 14:28:30 АСФР Админ
select GLMANAGER_RACXOD,PBS,pbsintime,ipbs from budget_cvclaim_view where year=:y and finorgan=:f and finobject=:fo
A1 05/02/2009 14:28:30 АСФР Админ
select rcog,caccountintime,CHESTAIF,CHESTIP,CHESTPOL,CHESTAD,CHESTAIFV from budget_finobject_view where year=:y and finorgan=:f and finobject=:fo
A1 05/02/2009 14:28:30 АСФР Админ
select finobjType,name from budget_finobjectType_view where year=:y order by finobjtype
A1 05/02/2009 14:28:30 АСФР Админ
select pkfo from budget_finobject_view1 where year=:y and finorgan=:f and finobject=:o
A1 05/02/2009 14:28:30 АСФР Админ
update budget_finobject_view1 set pkfo=:r where year=:y and finorgan=:f and finobject=:o
A1 05/02/2009 14:28:30 АСФР Админ
...
Здесь много очень ценной дребедени, которая поможет мне лучше разобратся во внутренней структуре базы данных Башфина. Как будет время, обязательно займусь изучением полученной информации. :)
Кому интересно: программу и библиотеку я писал на Delphi 7, если вам нужны исходные коды: пишите мне, я не жадный. :)
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |