![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Внедрить контрол на чужое окно [D7, WinXP]
Cobalt © (2008-07-25 11:09:00)Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен.
Необходимо её "немножко дополнить".
Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.
Переписывать её совершенно не хочется, поэтому хочу внедриьтся и добавить на форму кнопку "Печатать доп. документы", считав значения в полях ввода (нужно примерно треть от всех полей формы).
Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.
Кто лучше в теме - подтвердите или пните в нужном направлении.
Leonid Troyanovsky (2008-07-25 16:17:00) [21]
> Cobalt (25.07.08 16:04) [15]
> моя функция, которая будет считывать текст с контролов и
> открывать Ворд.
Вот упрямец. Ворд и есть то приложение, которое ты
собрался писать. Тебе лишь осталось написать макрос,
который вытащит текст из злосчастного приложения.
И не надо никаких других приложений и хуков.
--
Regards, LVT.
Leonid Troyanovsky (2008-07-25 16:12:00) [22]
> Cobalt (25.07.08 16:00) [14]
> не видна :(
Какой нах TButton - CreateWindowEx.
Говорят тебе - добавь пункт в системное меню, а в хуке WH_CALLWNDPROC* обрабатывай свой WM_SYSCOMMAND.
--
Regards, LVT.
Сергей М. (2008-07-25 16:08:00) [23]
> WordDM
Этот объект в чьемАП ?
Думай головой)...
Cobalt (2008-07-25 16:04:00) [24]Кажется, меня не все понимают.
мне не надо изменятьсуществующий функционал.
мне надо дополнить.
еще одна кнопка;
моя функция, которая будет считывать текст с контролов и открывать Ворд.
при загрузке ДЛЛ в АП процесса, там же будет и весь код ейный, обработчиков и прочей фигни.вот только не знаю, при загрузке ДЛЛ с формой, происходит ли инициализация Application и прочей инфраструктуры?
Cobalt (2008-07-25 16:00:00) [25]что-то не внедряется кнопка в чужое АП :(
не видна :(
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.
Сергей М. (2008-07-25 15:52:00) [26]
> Leonid Troyanovsky © (25.07.08 13:17) [9]
Я к тому что "чужое" приложение понятия не имеет, что делать с этим неожиданно свалившимся на нее "счастьем" в виде невесть откуда взявшихся в ее хозяйстве контролов.
Хук это будет или ручной инжект - не суть как важно.
Важно что без этого полноценная прикладная функциональность этих контролов невозможна.
Anatoly Podgoretsky (2008-07-25 13:32:00) [27]> Cobalt (25.07.2008 12:32:07) [7]
Ну и что, у вас же разные адресные пространства и ничего про внутреннею реализацию неизвестно.
Leonid Troyanovsky (2008-07-25 13:27:00) [28]
> Cobalt (25.07.08 11:59) [5]
> поля не tedit/memo.
А какая разница, если getwindowtext годится.
> и зависить от этих документов не хочется - лучше работать
> с первичкой.
Я говорил о документе, который сделан специально для печати
доп. документов. Макрос считает значения нужных полей
путем getwindowtext и подготовит документ(ы) для печати.
--
Regards, LVT.
Leonid Troyanovsky (2008-07-25 13:19:00) [29]
> Cobalt (25.07.08 12:32) [7]
> Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
Зачем кнопка? Добавь пункт, скажем, в системное меню
и обрабатывай свой WM_SYSCOMMAND.
--
Regards, LVT.
Leonid Troyanovsky (2008-07-25 13:17:00) [30]
> Сергей М. © (25.07.08 12:56) [8]
> Мало написать, его следует еще и внедрить в ВАП процесса-
> "жертвы")
Если зацеплен первичный поток, то хуковая процедура работает
в его контексте.
--
Regards, LVT.
Сергей М. (2008-07-25 12:56:00) [31]
> я сам напишу обработчик, для СВОЕЙ кнопки
Мало написать, его следует еще и внедритьв ВАП процесса-"жертвы")
Cobalt (2008-07-25 12:32:00) [32]Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
Медвежонок Пятачок (2008-07-25 12:12:00) [33]Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
И чего?
Оригинальная программа ничего не знает про твой внедренный контрол.
Точнее алгоритм формирования дока ничего про него не знает.
Cobalt (2008-07-25 11:59:00) [34]2 Leonid Troyanovsky © (25.07.08 11:27) [2]
Догнал :)
поля не tedit/memo.
и зависить от этих документов не хочется - лучше работать с первичкой.
Cobalt (2008-07-25 11:58:00) [35]Поясню еще раз:
контролов на форме сторонней программы - около 70-ти штук.
и кнопка, по которой она открывает 4 док-файла, где заменяет условные слова (типа ном_дог$ или дата$) на введенные значения.
Макросы посему я не вижу куда применить :(
это не "поля", а просто замена (видно прямо, как текст заменяется если комп загружен в это время)
Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку (уже сделал), добавляет контрол на форму и оставляет эту программу работать.
А по обработчику кнопки уже я буду считывать поля (getwindowstext), и открывать свои 3 документа, и заменять текст.
Медвежонок Пятачок (2008-07-25 11:27:00) [36]Начнешь внедрять новую процедуру формирования док файла?
И что получится в остатке?
Чужой exe в роли формы ввода данных и своя процедура обработки?
Leonid Troyanovsky (2008-07-25 11:27:00) [37]
> Cobalt (25.07.08 11:09)
> Переписывать её совершенно не хочется, поэтому хочу внедриьтся
> и добавить на форму кнопку "Печатать доп. документы", считав
> значения в полях ввода (нужно примерно треть от всех полей
> формы).
Если поля есть TEdit/Memo, то никуда внедряться и не следует.
Напиши в Word макрос, который найдет требуемые поля,
получит из них текст и вставит в печатаемый документ.
--
Regards, LVT.
Медвежонок Пятачок (2008-07-25 11:25:00) [38]Ну внедришь. А дальше что?