Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.27;
Скачать: CL | DM;

Вниз

Внедрить контрол на чужое окно   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.012 c
2-1248171481
MAX
2009-07-21 14:18
2009.09.27
таблицы Word


2-1248080860
Kiminchua
2009-07-20 13:07
2009.09.27
Парсинг текстового документа и преобразование его в Excel


2-1248329999
Лёша
2009-07-23 10:19
2009.09.27
Экпрорт в Excel произвольного набора данных.


2-1248246109
DevilDevil
2009-07-22 11:01
2009.09.27
Чтение/запись файла в отдельном потоке


8-1197569017
NaRuTo
2007-12-13 21:03
2009.09.27
Мерцания на TImage