![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли динаически создать форму в чужом приложении? [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() и открывать нужные окна.