Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
ВнизМожно ли динаически создать форму в чужом приложении? Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c