-
Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен. Необходимо её "немножко дополнить". Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.
Переписывать её совершенно не хочется, поэтому хочу внедриьтся и добавить на форму кнопку "Печатать доп. документы", считав значения в полях ввода (нужно примерно треть от всех полей формы).
Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.
Кто лучше в теме - подтвердите или пните в нужном направлении.
-
Ну внедришь. А дальше что?
-
> Cobalt (25.07.08 11:09)
> Переписывать её совершенно не хочется, поэтому хочу внедриьтся > и добавить на форму кнопку "Печатать доп. документы", считав > значения в полях ввода (нужно примерно треть от всех полей > формы).
Если поля есть TEdit/Memo, то никуда внедряться и не следует. Напиши в Word макрос, который найдет требуемые поля, получит из них текст и вставит в печатаемый документ.
-- Regards, LVT.
-
Начнешь внедрять новую процедуру формирования док файла? И что получится в остатке? Чужой exe в роли формы ввода данных и своя процедура обработки?
-
Поясню еще раз: контролов на форме сторонней программы - около 70-ти штук. и кнопка, по которой она открывает 4 док-файла, где заменяет условные слова (типа ном_дог$ или дата$) на введенные значения.
Макросы посему я не вижу куда применить :( это не "поля", а просто замена (видно прямо, как текст заменяется если комп загружен в это время)
Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
А по обработчику кнопки уже я буду считывать поля (getwindowstext), и открывать свои 3 документа, и заменять текст.
-
2 Leonid Troyanovsky © (25.07.08 11:27) [2] Догнал :) поля не tedit/memo. и зависить от этих документов не хочется - лучше работать с первичкой.
-
Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
И чего? Оригинальная программа ничего не знает про твой внедренный контрол. Точнее алгоритм формирования дока ничего про него не знает.
-
Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
-
> я сам напишу обработчик, для СВОЕЙ кнопки
Мало написать, его следует еще и внедрить в ВАП процесса-"жертвы")
-
> Сергей М. © (25.07.08 12:56) [8]
> Мало написать, его следует еще и внедрить в ВАП процесса- > "жертвы")
Если зацеплен первичный поток, то хуковая процедура работает в его контексте.
-- Regards, LVT.
-
> Cobalt (25.07.08 12:32) [7]
> Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
Зачем кнопка? Добавь пункт, скажем, в системное меню и обрабатывай свой WM_SYSCOMMAND.
-- Regards, LVT.
-
> Cobalt (25.07.08 11:59) [5]
> поля не tedit/memo.
А какая разница, если getwindowtext годится.
> и зависить от этих документов не хочется - лучше работать > с первичкой.
Я говорил о документе, который сделан специально для печати доп. документов. Макрос считает значения нужных полей путем getwindowtext и подготовит документ(ы) для печати.
-- Regards, LVT.
-
> Cobalt (25.07.2008 12:32:07) [7]
Ну и что, у вас же разные адресные пространства и ничего про внутреннею реализацию неизвестно.
-
> Leonid Troyanovsky © (25.07.08 13:17) [9]
Я к тому что "чужое" приложение понятия не имеет, что делать с этим неожиданно свалившимся на нее "счастьем" в виде невесть откуда взявшихся в ее хозяйстве контролов. Хук это будет или ручной инжект - не суть как важно. Важно что без этого полноценная прикладная функциональность этих контролов невозможна.
-
что-то не внедряется кнопка в чужое АП :( не видна :( procedure AddHoc();
begin
LoadLibrary('hook_dll1.dll');
WordDM:=TWordDM.Create(NIL);
MainFormWnd:=FindWindowEx(0,0,'TForm1','Form1');
Button:=TButton.CreateParented(MainFormWnd);
Button.Name:='MyPrint';
Button.Caption:='ПТС и Страховка';
Button.Top:=0;
Button.Left:=0;
Button.Width:= 121;
Button.Height := 25;
Button.Visible:=True;
Button.OnClick:=WordDM.ButtonClick;
end; Причем, если после этого дела попытаться прочитать Button.ParentWindow, то происходит AV.
-
Кажется, меня не все понимают. мне не надо изменять существующий функционал. мне надо дополнить. еще одна кнопка; моя функция, которая будет считывать текст с контролов и открывать Ворд. при загрузке ДЛЛ в АП процесса, там же будет и весь код ейный, обработчиков и прочей фигни.вот только не знаю, при загрузке ДЛЛ с формой, происходит ли инициализация Application и прочей инфраструктуры?
-
> WordDM
Этот объект в чьем АП ? Думай головой)...
-
> Cobalt (25.07.08 16:00) [14]
> не видна :(
Какой нах TButton - CreateWindowEx. Говорят тебе - добавь пункт в системное меню, а в хуке WH_CALLWNDPROC* обрабатывай свой WM_SYSCOMMAND.
-- Regards, LVT.
-
> Cobalt (25.07.08 16:04) [15]
> моя функция, которая будет считывать текст с контролов и > открывать Ворд.
Вот упрямец. Ворд и есть то приложение, которое ты собрался писать. Тебе лишь осталось написать макрос, который вытащит текст из злосчастного приложения. И не надо никаких других приложений и хуков.
-- Regards, LVT.
-
> Сергей М. © (25.07.08 15:52) [13] > > Я к тому что "чужое" приложение понятия не имеет, что делать > с этим неожиданно свалившимся на нее "счастьем" в виде невесть > откуда взявшихся в ее хозяйстве контролов.
Почему не будет? Дочернее окно будет создано тем же первичным потоком - примет ака родное. Если хук на CALLWNDPROC - даже сабклассировать не потребуется.
-- Regards, LVT.
-
> Leonid Troyanovsky © (25.07.08 16:23) [19]
Так ведь хук же !
Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)
И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.
-
> Сергей М. © (25.07.08 16:30) [20]
> Для чужого процесса код хук-модуля, который система влупила > в его АП, как ни крути, "родным" не назовешь)
Будем звать побратимом.
> И потом, контрол следует создавать именно в ходе иниц-ции > хук-модуля в АП "жертвы", а не так как делает автор.
А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно, но, может в этом есть некий сермяжный смысл.
-- Regards, LVT.
-
2 Сергей М. © (25.07.08 16:08) [16]Это код в ДЛЛ-ке. ведь иначе в чужой АП хуком не внедриться. 2 Leonid Troyanovsky © дело в том, что мне нужна кнопочка на чужой форме Итак, кнопочка видна, но отчего-то не реагирует на нажатие :( если кому интересно: 1) Ставлю хук (hook_dll1) SetWindowsHookEx(WH_CALLWNDPROC, @SysMsgProc, HInstance, THID); 2) При первом же срабатывании вызывает внедряльщик: function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
if not GlobalData^.Installed
then begin
GlobalData^.Installed:=true;
AddHoc();
end;
end; 3) Внедрение: procedure AddHoc();
begin
LoadLibrary('hook_dll1.dll');
Button:=TButton.CreateParented(MainFormWnd);
Button.Visible:=false;
Button.Name:='MyPrint';
Button.Caption:='ПТС и Страховка';
Button.Left:=375;
Button.Top:=532;
Button.Width:= 121;
Button.Height := 25;
Button.OnClick:=WordDM.ButtonClick;
Button.Visible:=True;
end;
-
> LoadLibrary('hook_dll1.dll');
А это тогда что за зверь ? Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?
-
Прошу прощения, правильный код рутины Function AddHoc:integer;
begin
LoadLibrary('hook_dll1.dll');
гружу я её из хука для того, чтобы после снятия хука длл-ка осталась в АП программы, куда я внедрился и ничего не грохнулось с AV.
WordDM:=TWordDM.Create(nil); MainFormWnd:=FindWindowEx(0,0,'TForm1','Form1');
Button:=TButton.CreateParented(MainFormWnd);
Button.Visible:=false;
Button.Name:='MyPrint';
Button.Caption:='ПТС и страховка';
Button.Left:=375;
Button.Top:=532;
Button.Width:= 121;
Button.Height := 25;
Button.OnClick:=WordDM.ButtonClick;
Button.Visible:=True;
Result:=Button.Handle;
end;
type
TWordDM = class(TDataModule)
WordApplication1: TWordApplication;
public
procedure ButtonClick(Sender: TObject);
end;
procedure TWordDM.ButtonClick(Sender: TObject);
begin
MessageBox(0,'+++','',0);
end; Вот теперь кнопка видна, но при нажатии ничего не происходит :(
-
2 Сергей М. © А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)
-
> Cobalt (25.07.08 17:13) [22]
> дело в том, что мне нужна кнопочка на чужой форме
Изволь, пусть будет, мы ж против.
Только, обрабатывать надо не какой-то ButtonClick, а WM_COMMAND оной кнопы, в хуковой процедуре.
Да и, во-ще, дисциплинировать себя надо- никаких TButton, CreateWindow* only.
-- Regards, LVT.
-
> Cobalt (25.07.08 17:34) [25]
> А внедрена-то либа только на время хука, а после снятия > хука будет выгружена (1 раз)
Не факт, что выгружена, кода не видно. Еще одна интерфренция - что будет, если захученный поток умрет раньше своего мучителя.
-- Regards, LVT.
-
> гружу я её из хука для того, чтобы после снятия хука длл- > ка осталась в АП программы, куда я внедрился и ничего не > грохнулось с AV
Кулибин)
Тебе не кнопки в чужие проги тыкать, а за буквари садиться)
-
2 Сергей М. © Вы уж простите, но Рихтера я уже прочитал ;)
2 Leonid Troyanovsky © (25.07.08 18:02) [26] спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону. Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.
-
> Cobalt (25.07.08 20:46) [29]
Что тебя на хуках залинило-то ? Непонятно .. Мало ли способов заствить жертву родить) ..
-
Это инструмент, удобный для различных задач: 1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена. 2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.
Как видно, ничего сложного нет :)
-
Мне вот еще один "ништяк" интересен - а как прочие процессы реагируют на твой шприц ?
-
Никак. ибо реагирует одна программа - избранная. На которую я поставил хук. Я ведь знаю, что в ней 1 поток.
Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...
-
> Cobalt (26.07.08 01:43) [33] > > Никак. ибо реагирует одна программа - избранная. На которую > я поставил хук. >
Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?
-
HHOOK SetWindowsHookEx(
int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );
-
> внедрившись в чужое АП Дельфовой программы, написанное в > той же версии, можно подхватить там Application через хендл > главного окна,
Можно. Но осторожно)
-
Блин, функцию свою назначил через SetWindowLong, вижу, что кнопка обрабатывает своё WM_LBUTTONUP, но она не отрисовывается :((( function MyWndProc(HWindow: HWnd; Msg, WParam: Longint;
LParam: Longint): Longint; stdcall;
begin
if (HWindow=Button.Handle) AND (Msg=WM_LBUTTONUP)
then begin
MessageBox(0,'Нажата кнопка','',0);
Result:=0;
end
Else Result:=DefWindowProc(HWindow, Msg, WParam, LParam);
end;
Причём, если функцию не назначать, то она отрисовывается. Вопрос - как заставить её обрабатывать прочие сообщения?
-
> Cobalt (28.07.08 13:38) [37] > Блин, функцию свою назначил через SetWindowLong, вижу, что > кнопка обрабатывает своё WM_LBUTTONUP
Субклассировать надо окно парента, и отлавливать там WM_COMMAND этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.
Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is sending, т.е., ее можно поймать в хуке CALLWNDPROC.
И еще, выкинь нах TButton, CreateWindow* only.
-- Regards, LVT.
|