Форум: "Основная";
Текущий архив: 2009.09.27;
Скачать: [xml.tar.bz2];
ВнизВнедрить контрол на чужое окно Найти похожие ветки
← →
Cobalt (2008-07-25 11:09) [0]Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен.
Необходимо её "немножко дополнить".
Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.
Переписывать её совершенно не хочется, поэтому хочу внедриьтся и добавить на форму кнопку "Печатать доп. документы", считав значения в полях ввода (нужно примерно треть от всех полей формы).
Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.
Кто лучше в теме - подтвердите или пните в нужном направлении.
← →
Медвежонок Пятачок © (2008-07-25 11:25) [1]Ну внедришь. А дальше что?
← →
Leonid Troyanovsky © (2008-07-25 11:27) [2]
> Cobalt (25.07.08 11:09)
> Переписывать её совершенно не хочется, поэтому хочу внедриьтся
> и добавить на форму кнопку "Печатать доп. документы", считав
> значения в полях ввода (нужно примерно треть от всех полей
> формы).
Если поля есть TEdit/Memo, то никуда внедряться и не следует.
Напиши в Word макрос, который найдет требуемые поля,
получит из них текст и вставит в печатаемый документ.
--
Regards, LVT.
← →
Медвежонок Пятачок © (2008-07-25 11:27) [3]Начнешь внедрять новую процедуру формирования док файла?
И что получится в остатке?
Чужой exe в роли формы ввода данных и своя процедура обработки?
← →
Cobalt (2008-07-25 11:58) [4]Поясню еще раз:
контролов на форме сторонней программы - около 70-ти штук.
и кнопка, по которой она открывает 4 док-файла, где заменяет условные слова (типа ном_дог$ или дата$) на введенные значения.
Макросы посему я не вижу куда применить :(
это не "поля", а просто замена (видно прямо, как текст заменяется если комп загружен в это время)
Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
А по обработчику кнопки уже я буду считывать поля (getwindowstext), и открывать свои 3 документа, и заменять текст.
← →
Cobalt (2008-07-25 11:59) [5]2 Leonid Troyanovsky © (25.07.08 11:27) [2]
Догнал :)
поля не tedit/memo.
и зависить от этих документов не хочется - лучше работать с первичкой.
← →
Медвежонок Пятачок © (2008-07-25 12:12) [6]Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
И чего?
Оригинальная программа ничего не знает про твой внедренный контрол.
Точнее алгоритм формирования дока ничего про него не знает.
← →
Cobalt (2008-07-25 12:32) [7]Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
← →
Сергей М. © (2008-07-25 12:56) [8]
> я сам напишу обработчик, для СВОЕЙ кнопки
Мало написать, его следует еще и внедрить в ВАП процесса-"жертвы")
← →
Leonid Troyanovsky © (2008-07-25 13:17) [9]
> Сергей М. © (25.07.08 12:56) [8]
> Мало написать, его следует еще и внедрить в ВАП процесса-
> "жертвы")
Если зацеплен первичный поток, то хуковая процедура работает
в его контексте.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-07-25 13:19) [10]
> Cobalt (25.07.08 12:32) [7]
> Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
Зачем кнопка? Добавь пункт, скажем, в системное меню
и обрабатывай свой WM_SYSCOMMAND.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-07-25 13:27) [11]
> Cobalt (25.07.08 11:59) [5]
> поля не tedit/memo.
А какая разница, если getwindowtext годится.
> и зависить от этих документов не хочется - лучше работать
> с первичкой.
Я говорил о документе, который сделан специально для печати
доп. документов. Макрос считает значения нужных полей
путем getwindowtext и подготовит документ(ы) для печати.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2008-07-25 13:32) [12]> Cobalt (25.07.2008 12:32:07) [7]
Ну и что, у вас же разные адресные пространства и ничего про внутреннею реализацию неизвестно.
← →
Сергей М. © (2008-07-25 15:52) [13]
> Leonid Troyanovsky © (25.07.08 13:17) [9]
Я к тому что "чужое" приложение понятия не имеет, что делать с этим неожиданно свалившимся на нее "счастьем" в виде невесть откуда взявшихся в ее хозяйстве контролов.
Хук это будет или ручной инжект - не суть как важно.
Важно что без этого полноценная прикладная функциональность этих контролов невозможна.
← →
Cobalt (2008-07-25 16:00) [14]что-то не внедряется кнопка в чужое АП :(
не видна :(procedure AddHoc();
begin
LoadLibrary("hook_dll1.dll");
//MessageBox(0,"111","",0);
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;
//MessageBox(0,"222","",0);
end;
Причем, если после этого дела попытаться прочитать Button.ParentWindow, то происходит AV.
← →
Cobalt (2008-07-25 16:04) [15]Кажется, меня не все понимают.
мне не надо изменять существующий функционал.
мне надо дополнить.
еще одна кнопка;
моя функция, которая будет считывать текст с контролов и открывать Ворд.
при загрузке ДЛЛ в АП процесса, там же будет и весь код ейный, обработчиков и прочей фигни.вот только не знаю, при загрузке ДЛЛ с формой, происходит ли инициализация Application и прочей инфраструктуры?
← →
Сергей М. © (2008-07-25 16:08) [16]
> WordDM
Этот объект в чьем АП ?
Думай головой)...
← →
Leonid Troyanovsky © (2008-07-25 16:12) [17]
> Cobalt (25.07.08 16:00) [14]
> не видна :(
Какой нах TButton - CreateWindowEx.
Говорят тебе - добавь пункт в системное меню, а в хуке WH_CALLWNDPROC* обрабатывай свой WM_SYSCOMMAND.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-07-25 16:17) [18]
> Cobalt (25.07.08 16:04) [15]
> моя функция, которая будет считывать текст с контролов и
> открывать Ворд.
Вот упрямец. Ворд и есть то приложение, которое ты
собрался писать. Тебе лишь осталось написать макрос,
который вытащит текст из злосчастного приложения.
И не надо никаких других приложений и хуков.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-07-25 16:23) [19]
> Сергей М. © (25.07.08 15:52) [13]
>
> Я к тому что "чужое" приложение понятия не имеет, что делать
> с этим неожиданно свалившимся на нее "счастьем" в виде невесть
> откуда взявшихся в ее хозяйстве контролов.
Почему не будет? Дочернее окно будет создано тем же первичным
потоком - примет ака родное. Если хук на CALLWNDPROC -
даже сабклассировать не потребуется.
--
Regards, LVT.
← →
Сергей М. © (2008-07-25 16:30) [20]
> Leonid Troyanovsky © (25.07.08 16:23) [19]
Так ведь хук же !
Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)
И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.
← →
Leonid Troyanovsky © (2008-07-25 16:43) [21]
> Сергей М. © (25.07.08 16:30) [20]
> Для чужого процесса код хук-модуля, который система влупила
> в его АП, как ни крути, "родным" не назовешь)
Будем звать побратимом.
> И потом, контрол следует создавать именно в ходе иниц-ции
> хук-модуля в АП "жертвы", а не так как делает автор.
А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно,
но, может в этом есть некий сермяжный смысл.
--
Regards, LVT.
← →
Cobalt (2008-07-25 17:13) [22]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;
← →
Сергей М. © (2008-07-25 17:17) [23]
> LoadLibrary("hook_dll1.dll");
А это тогда что за зверь ?
Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?
← →
Cobalt (2008-07-25 17:31) [24]Прошу прощения, правильный код рутины
Function AddHoc:integer;
begin
LoadLibrary("hook_dll1.dll");
// та та длл-ка, в которой мой хук сидит.
гружу я её из хука для того, чтобы после снятия хука длл-ка осталась в АП программы, куда я внедрился и ничего не грохнулось с AV.
WordDM:=TWordDM.Create(nil); //DataModule, просто чтобы было от кого прицепить обработчик, см. объявление ниже
MainFormWnd:=FindWindowEx(0,0,"TForm1","Form1");
Button:=TButton.CreateParented(MainFormWnd);
Button.Visible:=false;
//Result:=Integer(Button);
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;
Вот теперь кнопка видна, но при нажатии ничего не происходит :(
← →
Cobalt (2008-07-25 17:34) [25]2 Сергей М. ©
А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)
← →
Leonid Troyanovsky © (2008-07-25 18:02) [26]
> Cobalt (25.07.08 17:13) [22]
> дело в том, что мне нужна кнопочка на чужой форме
Изволь, пусть будет, мы ж против.
Только, обрабатывать надо не какой-то ButtonClick,
а WM_COMMAND оной кнопы, в хуковой процедуре.
Да и, во-ще, дисциплинировать себя надо- никаких TButton,
CreateWindow* only.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2008-07-25 18:11) [27]
> Cobalt (25.07.08 17:34) [25]
> А внедрена-то либа только на время хука, а после снятия
> хука будет выгружена (1 раз)
Не факт, что выгружена, кода не видно.
Еще одна интерфренция - что будет, если захученный поток
умрет раньше своего мучителя.
--
Regards, LVT.
← →
Сергей М. © (2008-07-25 19:23) [28]
> гружу я её из хука для того, чтобы после снятия хука длл-
> ка осталась в АП программы, куда я внедрился и ничего не
> грохнулось с AV
Кулибин)
Тебе не кнопки в чужие проги тыкать, а за буквари садиться)
← →
Cobalt (2008-07-25 20:46) [29]2 Сергей М. ©
Вы уж простите, но Рихтера я уже прочитал ;)
2 Leonid Troyanovsky © (25.07.08 18:02) [26]
спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону.
Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.
← →
Сергей М. © (2008-07-25 21:04) [30]
> Cobalt (25.07.08 20:46) [29]
Что тебя на хуках залинило-то ?
Непонятно ..
Мало ли способов заствить жертву родить) ..
← →
Cobalt (2008-07-25 21:13) [31]Это инструмент, удобный для различных задач:
1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена.
2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.
Как видно, ничего сложного нет :)
← →
Сергей М. © (2008-07-25 21:51) [32]Мне вот еще один "ништяк" интересен - а как прочие процессы реагируют на твой шприц ?
← →
Cobalt (2008-07-26 01:43) [33]Никак. ибо реагирует одна программа - избранная. На которую я поставил хук.
Я ведь знаю, что в ней 1 поток.
Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...
← →
Германн © (2008-07-26 02:58) [34]
> Cobalt (26.07.08 01:43) [33]
>
> Никак. ибо реагирует одна программа - избранная. На которую
> я поставил хук.
>
Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?
← →
Cobalt (2008-07-26 09:45) [35]
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle of application instance
DWORD dwThreadId // identity of thread to install hook for
);
← →
Сергей М. © (2008-07-28 08:21) [36]
> внедрившись в чужое АП Дельфовой программы, написанное в
> той же версии, можно подхватить там Application через хендл
> главного окна,
Можно. Но осторожно)
← →
Cobalt (2008-07-28 13:38) [37]Блин, функцию свою назначил через 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;
Причём, если функцию не назначать, то она отрисовывается.
Вопрос - как заставить её обрабатывать прочие сообщения?
← →
Leonid Troyanovsky © (2008-07-28 14:57) [38]
> Cobalt (28.07.08 13:38) [37]
> Блин, функцию свою назначил через SetWindowLong, вижу, что
> кнопка обрабатывает своё WM_LBUTTONUP
Субклассировать надо окно парента, и отлавливать там WM_COMMAND
этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.
Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is
sending, т.е., ее можно поймать в хуке CALLWNDPROC.
И еще, выкинь нах TButton, CreateWindow* only.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.09.27;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c