Текущий архив: 2006.10.15;
Скачать: CL | DM;
Внизотобразить формы из dll Найти похожие ветки
← →
Bezols (2005-12-20 15:24) [0]Добрый день!
Никак не могу отобразить форму из dll на панели в приложении
для VCL у меня есть пример, там все работает.
В KOL не получается...
просто форма из dll выскакивает, но не на панели в приложении
← →
BaryVetaL © (2005-12-20 15:47) [1]Смотри примеры на сайте bonanzas.rinet.ru
← →
Bezols (2005-12-20 16:08) [2]смотрел примеры, нет там такого, есть только отображение формы из dll
при загрузке формы из dll получаю хендл этой формы
потом делаю SetParent(полученный хендл формы, Panel1.Handle);
ничего не выходит, форма отображается отдельно
может что ниправильно делаю?
← →
ECM © (2005-12-20 16:36) [3]
> может что ниправильно делаю?
... ага, даже с пишете с ашипками :))
Я делал иначе - при (или перед) вызове формы из Dll передавал ей хендл
панели (HostWND => Panel1.Handle) и вызвал SetParent до запуска цикла обработки сообщений в форме Dll:
{MyDllForm.pas}
...
if HostWND = 0 then NewDllForm( DllForm, Applet);
else begin
NewDllForm(DllForm,Applet);
SetParent(DllForm.Form.Handle,HostWND);
DllForm.Form.ClsStyle := DllForm.Form.ClsStyle or CS_PARENTDC;
end;
Run(Applet);
← →
Bezols (2005-12-20 17:43) [4]вот делал так..
{uMain.pas}
...
interface
...
function RunForm( SenderHandle: THandle ): Integer;
...
implementation
....
function RunForm(SenderHandle: THandle): Integer;
var
InitForm : procedure (AHandle: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar("library.dll"));
if FHandle <> 0 then
begin
InitForm := GetProcAddress(FHandle, "InitForm");
if @InitForm <> nil then
InitForm(Form1.Panel1.Handle);
FreeLibrary(FHandle);
end;
end;
...
procedure TForm1.Button1Click(Sender: PObj);
var
xHandle: THandle;
begin
xHandle:= RunForm(Panel1.Handle);
end;
далее
{library.dll}
...
function initPlugin(App: THandle): Thandle; stdcall;
....
function initPlugin(App: THandle): Thandle; stdcall;
begin
Applet := NewApplet("Dll applet");
SetParent(Form1.Form.Handle, App);
Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;
NewForm1(Form1, Applet);
Run(Applet);
end;
вообщем форма при вызове из приложения появляется, но просто как форма...
а не на панели :(
а при закрытии программы вываливается пара ошибок... и приложение закрывается
← →
ECM © (2005-12-20 18:28) [5]Хех... а что же Вы хотели? Как написали так и работает. У Вас SetParent работает по невыделенной памяти (как только не падает всё сразу?) - т.е. вхолостую.
Вы невнимательно читали [3]
function initPlugin(App: THandle): Thandle; stdcall;
begin
Applet := NewApplet("Dll applet");
NewForm1(Form1, Applet);
SetParent(Form1.Form.Handle, App);
Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;
//NewForm1(Form1, Applet);
Run(Applet);
end;
← →
Bezols (2005-12-21 00:49) [6]сделал так
{модуль программы}
procedure TForm1.Button1Click(Sender: PObj);
var
RunForm : function (AHandle: THandle): THandle; stdcall;
FHandle, xHWND: THandle;
begin
FHandle := LoadLibrary(PChar("dll\dll.dll"));
if FHandle <> 0 then
begin
RunForm := GetProcAddress(FHandle, "RunForm");
if @RunForm <> nil
then begin
xHWND:= RunForm(Panel1.Handle);
end
else FreeLibrary(FHandle);
end;
end;
{модуль библиотеки}
function RunForm(App: THandle): THandle; stdcall;
...
implementation
...
function RunForm(App: THandle): THandle; stdcall;
begin
Applet := NewApplet("");
NewForm1(Form1, Applet);
SetParent(Form1.Form.Handle, App);
Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;
result:= Form1.Panel1.Handle;
Form1.Form.Show;
end;
форма из dll отображается на панели главной приложения, которое загружает dll. Чтобы не было заголовка у формы из dll, я отключил системное меню и рамку окна. Теперь форма из dll нормально отображается на панели, но... если нажать мышкой на элементы формы из dll, то главная форма теряет фокус, если нажать мышкой на элементы главной формы, то форма получает фокус. Вообщем то жить можно, но не приятно, когда форма мигает заголовком.
И если я закрываю приложение, то вываливаются две ошибки AV...
Ну ошибки вываливаются потому что, в конце функции RunForm из dll я не сделал Run(Applet), а сделал Form1.Form.Show, для того чтобы продолжала работать основная программа, а если написать Run(Applet), то основная программа перестает работать пока открыта фома из dll
Как сделать так, чтобы на панели главной формы отображалось содержимое формы из dll и не было миганий заголовка главного окна, программа корректно закрывалась
вот как сделано на VCL http://p2ktools.nm.ru/PluginExmp.rar
а вот как я пытался сделать http://p2ktools.nm.ru/app.rar
Страницы: 1 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.045 c