Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
2-1248260534
FinFira
2009-07-22 15:02
2009.09.27
Как убрать краницу у кнопки


3-1222336216
wsv
2008-09-25 13:50
2009.09.27
Доступ к BerkleyDB


15-1248139231
Дмитрий С
2009-07-21 05:20
2009.09.27
Есть смысл ставить 64битную Висту


1-1216368170
Zhekson
2008-07-18 12:02
2009.09.27
Как в InputBox_е изменить шрифт ???


2-1248176092
Lamer6666
2009-07-21 15:34
2009.09.27
Регулярные выражения TRegExpr





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский