Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли динаически создать форму в чужом приложении? [D7, WinXP]


Denis ©   (2005-07-22 11:40:00) 

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


ANB   (2005-07-26 17:42:00) [1]


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


Digitman   (2005-07-26 15:44:00) [2]


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


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


alpet   (2005-07-26 09:07:00) [3]

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


Denis   (2005-07-26 08:43:00) [4]

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


Digitman   (2005-07-25 17:39:00) [5]

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

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


Digitman   (2005-07-25 17:06:00) [6]


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


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


Denis   (2005-07-25 14:46:00) [7]

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-22 13:30:00) [8]


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


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


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


не два.

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

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


Denis   (2005-07-22 13:15:00) [9]

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

Спасибо!


Digitman   (2005-07-22 13:03:00) [10]


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


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


alpet   (2005-07-22 12:58:00) [11]

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


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

Denis ©   (22.07.05 11:40)

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


Denis   (2005-07-22 11:54:00) [13]

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


Denis   (2005-07-22 11:46:00) [14]

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

Оно?


dmitry501   (2005-07-22 11:44:00) [15]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо