-
Ситуация: есть готовая программа (Д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.
|