Конференция "Основная" » Внедрить контрол на чужое окно [D7, WinXP]
 
  • Cobalt (25.07.08 11:09) [0]
    Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен.
    Необходимо её "немножко дополнить".
    Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.

    Переписывать её совершенно не хочется, поэтому хочу внедриьтся и добавить на форму кнопку "Печатать доп. документы", считав значения в полях ввода (нужно примерно треть от всех полей формы).

    Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.

    Кто лучше в теме - подтвердите или пните в нужном направлении.
  • Медвежонок Пятачок © (25.07.08 11:25) [1]
    Ну внедришь. А дальше что?
  • Leonid Troyanovsky © (25.07.08 11:27) [2]

    > Cobalt   (25.07.08 11:09)  

    > Переписывать её совершенно не хочется, поэтому хочу внедриьтся
    > и добавить на форму кнопку "Печатать доп. документы", считав
    > значения в полях ввода (нужно примерно треть от всех полей
    > формы).

    Если поля есть TEdit/Memo, то никуда внедряться и не следует.
    Напиши в Word макрос, который найдет требуемые поля,
    получит из них текст и вставит в печатаемый документ.

    --
    Regards, LVT.
  • Медвежонок Пятачок © (25.07.08 11:27) [3]
    Начнешь внедрять новую процедуру формирования док файла?
    И что получится в остатке?
    Чужой exe в роли формы ввода данных и своя процедура обработки?
  • Cobalt (25.07.08 11:58) [4]
    Поясню еще раз:
    контролов на форме сторонней программы - около 70-ти штук.
    и кнопка, по которой она открывает 4 док-файла, где заменяет условные слова (типа ном_дог$ или дата$)  на введенные значения.

    Макросы посему я не вижу куда применить :(
    это не "поля", а просто замена (видно прямо, как текст заменяется если комп загружен в это время)

    Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку  (уже сделал), добавляет контрол на форму и оставляет эту программу работать.

    А по обработчику кнопки уже я буду считывать поля (getwindowstext), и открывать свои 3 документа, и заменять текст.
  • Cobalt (25.07.08 11:59) [5]
    2 Leonid Troyanovsky ©   (25.07.08 11:27) [2]
    Догнал :)
    поля не tedit/memo.
    и зависить от этих документов не хочется - лучше работать с первичкой.
  • Медвежонок Пятачок © (25.07.08 12:12) [6]
    Что я хочу - программка, запускает исходную (чужую), через хук внедряет в неё длл-ку  (уже сделал), добавляет контрол на форму и оставляет эту программу работать.

    И чего?
    Оригинальная программа ничего не знает про твой внедренный контрол.
    Точнее алгоритм формирования дока ничего про него не знает.
  • Cobalt (25.07.08 12:32) [7]
    Дык, я сам напишу обработчик, для СВОЕЙ кнопки.
  • Сергей М. © (25.07.08 12:56) [8]

    > я сам напишу обработчик, для СВОЕЙ кнопки


    Мало написать, его следует еще и внедрить в ВАП процесса-"жертвы")
  • Leonid Troyanovsky © (25.07.08 13:17) [9]

    > Сергей М. ©   (25.07.08 12:56) [8]

    > Мало написать, его следует еще и внедрить в ВАП процесса-
    > "жертвы")

    Если зацеплен первичный поток, то хуковая процедура работает
    в его контексте.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (25.07.08 13:19) [10]

    > Cobalt   (25.07.08 12:32) [7]

    > Дык, я сам напишу обработчик, для СВОЕЙ кнопки.

    Зачем кнопка? Добавь пункт, скажем, в системное меню
    и обрабатывай свой WM_SYSCOMMAND.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (25.07.08 13:27) [11]

    > Cobalt   (25.07.08 11:59) [5]

    > поля не tedit/memo.

    А какая разница, если getwindowtext годится.

    > и зависить от этих документов не хочется - лучше работать
    > с первичкой.

    Я говорил о документе, который сделан специально для печати
    доп. документов. Макрос считает значения нужных полей
    путем  getwindowtext и подготовит документ(ы) для печати.

    --
    Regards, LVT.
  • Anatoly Podgoretsky © (25.07.08 13:32) [12]
    > Cobalt  (25.07.2008 12:32:07)  [7]

    Ну и что, у вас же разные адресные пространства и ничего про внутреннею реализацию неизвестно.
  • Сергей М. © (25.07.08 15:52) [13]

    > Leonid Troyanovsky ©   (25.07.08 13:17) [9]


    Я к тому что "чужое" приложение понятия не имеет, что делать с этим неожиданно свалившимся на нее "счастьем" в виде невесть откуда взявшихся в ее хозяйстве контролов.
    Хук это будет или ручной инжект - не суть как важно.
    Важно что без этого полноценная прикладная функциональность этих контролов невозможна.
  • Cobalt (25.07.08 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 (25.07.08 16:04) [15]
    Кажется, меня не все понимают.
    мне не надо изменять существующий функционал.
    мне надо дополнить.
    еще одна кнопка;
    моя функция, которая будет считывать текст с контролов и открывать Ворд.
    при загрузке ДЛЛ в АП процесса, там же будет и весь код ейный, обработчиков и прочей фигни.вот только не знаю, при загрузке ДЛЛ с формой, происходит ли инициализация Application и прочей инфраструктуры?
  • Сергей М. © (25.07.08 16:08) [16]

    > WordDM


    Этот объект в чьем АП ?
    Думай головой)...
  • Leonid Troyanovsky © (25.07.08 16:12) [17]

    > Cobalt   (25.07.08 16:00) [14]

    > не видна :(

    Какой нах TButton - CreateWindowEx.
    Говорят тебе - добавь пункт в системное меню, а  в хуке WH_CALLWNDPROC* обрабатывай свой WM_SYSCOMMAND.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (25.07.08 16:17) [18]

    > Cobalt   (25.07.08 16:04) [15]

    > моя функция, которая будет считывать текст с контролов и
    > открывать Ворд.

    Вот упрямец. Ворд и есть то приложение, которое ты
    собрался писать. Тебе лишь осталось написать макрос,
    который вытащит текст из злосчастного приложения.
    И не надо никаких других приложений и хуков.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (25.07.08 16:23) [19]

    > Сергей М. ©   (25.07.08 15:52) [13]
    >
    > Я к тому что "чужое" приложение понятия не имеет, что делать
    > с этим неожиданно свалившимся на нее "счастьем" в виде невесть
    > откуда взявшихся в ее хозяйстве контролов.

    Почему не будет? Дочернее окно будет создано тем же первичным
    потоком - примет ака родное. Если хук на CALLWNDPROC -
    даже сабклассировать не потребуется.

    --
    Regards, LVT.
 
Конференция "Основная" » Внедрить контрол на чужое окно [D7, WinXP]
Есть новые Нет новых   [134492   +14][b:0][p:0.001]