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

Вниз

Можно ли динаически создать форму в чужом приложении?   Найти похожие ветки 

 
Denis ©   (2005-07-22 11:40) [0]

Приветствую всех!
Из своей программы мне нужно запускать другое приложение и открывать в нем нужную форму в зависимости от передаваемых в командной строке параметров.
Проблема в том, что все формы в стороннем приложении создаются динамически и в момент запуска еще не существуют. Подскажите, можно ли их создать из другого приложения, если известно имя класса и имя окна? Если можно,то как?


 
dmitry501 ©   (2005-07-22 11:44) [1]

Анализировать paramstr() и открывать нужные окна.


 
Denis ©   (2005-07-22 11:46) [2]

CreateWindow(ClassName, WindowName: PChar; Style: Longint; X, Y, Width, Height: Integer; WndParent: HWnd; Menu: HMenu; Instance: THandle; Param: Pointer): HWnd;

Оно?


 
Denis ©   (2005-07-22 11:54) [3]

>Анализировать paramstr() и открывать нужные окна.
ты вопрос читал?


 
Alexander Panov ©   (2005-07-22 12:27) [4]

Denis ©   (22.07.05 11:40)

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


 
alpet ©   (2005-07-22 12:58) [5]

Сомнительно. Это вообще то реализуемое дело, но довольно сложно - создание формы реализуется например с помощью метода Application.CreateForm. Чтобы его вызывать, придется работать "изнутри" процесса, что скорее всего потребует внедрения кода.
Так что проще подождать, пока это сторонее приложение само создаст нужные формы, и отобразить требуемую.


 
Digitman ©   (2005-07-22 13:03) [6]


> Можно ли динаически создать форму в чужом приложении


можно.
но вряд ли нужно.


 
Denis ©   (2005-07-22 13:15) [7]

Похоже никак не обойтись без измененния кода стороннего приложения...
Тогда здесь, видимо, 2 выхода - либо разбирать параметры в ParamStr
либо замещать оконную функцию.

Спасибо!


 
Digitman ©   (2005-07-22 13:30) [8]


> Похоже никак не обойтись без измененния кода стороннего
> приложения


не надо его менять. ни к чему совершенно.


> 2 выхода - либо разбирать параметры в ParamStr
> либо замещать оконную функцию.


не два.

есть и третий, старый и провереный как мир :

- установив хук (практически - любого вида) внедряешь в целевой процесс свою ДЛЛ
- при иниц-ции твоя внедренная ДЛЛ перехватывает любой из АПИ-вызовов, заведомо осуществляемых чужим процессом в осн.трэде
- в обработчике перехвата создаешь и визуализируешь все что тебе надо : хоть  форму, хоть любой VCL-контрол


 
Denis ©   (2005-07-25 14:46) [9]

2 Digitman ©  
Можно поподробнее? Я наваял длл с хуком WH_CALLWNDPROC, но "начинить" ее толком не смог. Прошу помощи...
Вот это "творение":

library Hook;
uses Windows, SysUtils;

var
CurrentHook :HHook;
FmClass     :PChar;
ThredH      :HWND;

function GlobalHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
var
WndH:HWND;
begin
 if code< 0
 then
  begin
    result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
    Exit;
  end;
   WndH := FindWindow(FmClass,nil);
   if WndH<>0
   then
     ShowWindow(WndH,SW_SHOW)
   else
     begin
              WndH:=CreateWindow(
              FmClass,
              nil,
              WS_MAXIMIZE,
              0,
              0,
              800,
              600,
              ThredH,
              HInstance,
              0,
              nil);
              ShowWindow(WndH,SW_SHOW);
     end;  
   CallNextHookEx(CurrentHook,code,wParam,lparam);
   result:=0;
end;
procedure SetupHook(IDTHREAD:HWND;FmClassName:PChar); stdcall; export;
begin
 CurrentHook:=SetWindowsHookEx(WH_CALLWNDPROC, @GlobalHook,HInstance, IDThread);
 FmClass:=FmClassName;
 ThredH:=IDTHREAD;
end;


 
Digitman ©   (2005-07-25 17:06) [10]


>  "начинить" ее толком не смог


не надо никого "начинять"
установка глоб.хука нужно только для внедрения хук-ДЛЛ в чужое АП


 
Digitman ©   (2005-07-25 17:39) [11]

э-э-э ... пардон, я, вероятно, недопонял вопрос ..

речь идет о "чужой" форме или о своей ?


 
Denis ©   (2005-07-26 08:43) [12]

2 Digitman © [11]
Речь идет о чужом приложение и о его же форме. В его АП нужно создать и открыть эту форму, но из моего приложения.


 
alpet ©   (2005-07-26 09:07) [13]

Denis ©   (26.07.05 08:43) [12]
Это сложно, и в целом не относится к WinAPI. Тебе по сути придется это "чужое" приложение реверсировать (дизассемблировать), чтобы получить доступ к конструкторам объектов его форм (в смысле узнать их адреса). При этом создание форм должно проводиться нетривиальным способом - синхронно с основным потоком "чужого" приложения, тут без внедрения кода (или DLL) просто не обойтись.
Поэтому лучший выход - дождаться таки, когда все формы будут созданы самим приложением, и показать предпочитаемую из них (ShowWindow). Да и спровоцировать приложение на создание форм будет  наверняка полегче, чем создавать их с помощью описанного метода.


 
Digitman ©   (2005-07-26 15:44) [14]


> Denis ©   (26.07.05 08:43) [12]


в общем  случае задача нерешаема.
о частных случаях же нет никакой инф-ции.


 
ANB ©   (2005-07-26 17:42) [15]


> Denis ©   (26.07.05 08:43) [12]
- без правки чужого приложения тут не обойтись. А если править - тут уже куча возможностей установить связь между ними, придумать протокольчик и исполнять в чужом приложении все переданные команды.



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
14-1124297005
NewWonder
2005-08-17 20:43
2005.09.18
Зацените систему управления CD-ROM ом


1-1125169052
rolex
2005-08-27 22:57
2005.09.18
Помогите переделать статистичн. вызов DLL в динамичный.


1-1124925531
Kisha
2005-08-25 03:18
2005.09.18
Синтаксический анализатор


6-1117029648
Delphi_is_cool
2005-05-25 18:00
2005.09.18
TTcpClient режим bmNonBlocking.


14-1124710103
КК
2005-08-22 15:28
2005.09.18
SHS1.EXE - что это