Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > работа с DLL через exe


Автор: z-END 1.3.2004, 15:58
Необходимо в .exe вставить формы содержащтеся в .dll причем не как отдельные окна, а в контрол (TPanel, TPageControl и т.п.)

Имеется такая структура:
main.exe
subXX.dll (библиотеки содержащие TForm's)

main.exe

Код
{
FormCreate
 vHandle[x] := LoadLibrary ('sub.dll');
 @vInterface[x] := GetProcAddress (vHandle[x], 'vInterface');
 @vClose[x] := GetProcAddress (vHandle[x], 'vClose');
...

FormActivate
  vInterface[x] ( Self.Panel);
...

FormClose
  vClose[x];
  FreeLibrary (vHandle[x]);
...
}


subXX.dll
Код
{
procedure vInterface(Parent:TsomeControl)
 DLLForm:=TDLLForm.CreateParented (Parent.Handle);
 DLLForm.Left:=0;
 DLLForm.Top:=0;
 DLLForm.Width:=Parent.Width;
 DLLForm.Height:=Parent.Height;
 DLLForm.Show;
}

Вроде-бы все хорошо работает... но несовсемsad.gif
В DLLForm's не работают элементы, например:
в DLLForm имеется RichEdit, при нажатии кнопки
DLLForm.Button:
Код
RichEdit.LoadFromFile('some.txt');

но загруженный текст не отображается в RichEdit, до тех пор пока не выполнить DLLForm.RecreateWND; а это уж очень некрасиво, т.к. перерисовывается все родительское окно из exe файла.

Есть ли другие варианты решения этой проблеммы?

Автор: <Spawn> 1.3.2004, 16:33
Попробуй инициализировать Application DLL - а. Т.е. создаешь проецдурку такого типа:

Код
procedure InitApplication(App: TAppliaction);
begin
 Forms.Application := App;
end;


и пихаешь в Длл, используя ее перед юзанием втоей ДЛЛ.

Автор: z-END 1.3.2004, 22:59
Да.. все гениальное простоsmile.gif спасибо!

тока теперь надо добавить в subXX.dll
Код
procedure vClose;
DLLForm.Free;
Forms.Application := nil

и все заработает

Автор: Unregistered 2.3.2004, 03:03
Может тогда корректней вот так?:

var OldApp:TApplication;

procedure InitApplication(App: TAppliaction);
begin
OldApp:=Application;
Application:=App;
end;

procedure UnInitApplication;
begin
Application:=OldApp;
end;

В смысле возвратить dll-ке ее старый application, и уже потом выгружать?

Автор: <Spawn> 2.3.2004, 05:38
Unregistered дак все работает уже.

Автор: z-END 2.3.2004, 14:42
Вообщето-даsmile.gif все уже работает
Hy a если че-то и неработает, то FreeLibararyAndExitThread и всеsmile.gif

И еслу уж быть точным, то в дллельке Application не инициализируется, ну покрайней мере я так думаюsmile.gif поэтому возвращать предидущее состояние Application смысла нет.
Если я неправ.... см нижеsmile.gif

Автор: z-END 2.3.2004, 20:08
Ну вот опять приколыsad.gif
Все хорошо работало, пока на форму на поместил TOpenDialog, при выполнении .Execute создаются Threads которые при закрытии программы невыгружаются... и программа остается висеть в памяти...
Чего делать? как бороться? непонятно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)