Fórum Abrir Form DLL usando LoadLibrary #315166
06/03/2006
0
como faço pra abrir um form que está numa dll? mas usando o LoadLibrary???
Eu sei como fazer usando o modo convencional, mas queria carregar a dll para um THandle e abrir o form a partir do THandle, assim logo apos eu poderia dar um Free no THandle e liberar da memória!
alguma dica???
abração
Eniorm
Curtir tópico
+ 0Posts
07/03/2006
Ermindo
vc poderia fazer o seguinte:
Na DLL, poderia criar uma preocedure tipo:
Procedure Proc;stdcall;
begin
Form1:=Tform1.create(application);
Form1.showmodal;
Form1.release;
end;
e no seu Aplicativo, poderia criar uma procedure:
procedure TForm1.Button1Click(Sender: TObject);
var HD: THandle;
proc :function:string; stdcall;
begin
HD:= LoadLibrary(´lib.dll´);
if HD <> 0 then
begin
@proc := GetProcAddress(hd, ´Poc´);
if @proc <> nil then
proc;
freelibrary(HD);
end;
end;
[]´s
Ermindo Lopes
Gostei + 0
13/03/2006
Eniorm
procedure TForm1.Button1Click(Sender: TObject); var HD: THandle; proc :function:string; stdcall; begin HD:= LoadLibrary(´lib.dll´); if HD <> 0 then begin @proc := GetProcAddress(hd, ´Poc´); if @proc <> nil then proc; freelibrary(HD); end; end;
O código acima funciona, mas qdo a Dll que está na var THandle é liverada:
[b:038fdf50c9]FreeLibrary(HD);[/b:038fdf50c9]
O aplicativo gera um erro, run-time error, então, se eu remover essa linha, funciona perfeitamente!!!!!
Porque será?
abraço
Gostei + 0
14/03/2006
Ermindo
[]1 Ermindo
Gostei + 0
14/03/2006
Ermindo
[]´ Ermindo
Gostei + 0
14/03/2006
Ermindo
[]´ Ermindo
Gostei + 0
14/03/2006
Martins
Se vc vai usar ShareMem, inclua da DLL e no DPR OK!!
Gostei + 0
15/03/2006
Eniorm
ja coloquei o ShareMem, e MidasLib tanto do DPR da dll como na aplicação .exe que vai chamar a dll mas ainda acontece erro de violação qdo fecho o form/dll e uso o FreeLibrary.
falow+
Gostei + 0
15/03/2006
Eniorm
ja coloquei o ShareMem, e MidasLib tanto do DPR da dll como na aplicação .exe que vai chamar a dll mas ainda acontece erro de violação qdo fecho o form/dll e uso o FreeLibrary.
falow+
Gostei + 0
15/03/2006
Martins
ja coloquei o ShareMem, e MidasLib tanto do DPR da dll como na aplicação .exe que vai chamar a dll mas ainda acontece erro de violação qdo fecho o form/dll e uso o FreeLibrary.
falow+[/quote:76bae26c8f]
Enio, vc poderia postar aqui os cabeçalhos de sua DLL e de seu DPR do projeto, bem como a chamada dinâmica a sua DLL?
Valew!!
Gostei + 0
15/03/2006
Eniorm
uses ShareMem, MidasLib, SysUtils, Classes, Forms, U_Funcoes in ´..\U_Funcoes.pas´, U_Mensagem in ´..\U_Mensagem.pas´ , ......... procedure GradeUsuarios; stdcall; begin Application.CreateForm(TF_GradeUsuarios,F_GradeUsuarios); F_GradeUsuarios.ShowModal; F_GradeUsuarios.Release; end; exports GradeUsuarios;
Agora, no projeto dpr do .exe
program CTI_Informatica;
uses
ShareMem,
MidasLib,
Forms,
U_Principal in ´U_Principal.pas´ ,
UDataModulo in ´..\UDataModulo.pas´ {DataModule1: TDataModule},
U_ReconcileError in ´..\U_ReconcileError.pas´ ;na Unit principal, uso o procedimento para chamar a dll:
procedure TForm1.CallDLL(LibName, Procedimento: String); var DLL : THandle; proc : procedure; stdcall; begin DLL := LoadLibrary(PChar(LibName)); if (DLL <> 0) then begin proc := GetProcAddress(DLL,PChar(Procedimento)); if (@proc <> Nil) then proc; end; // FreeLibrary(DLL); end;
e para chamar o form eu uso no evento OnClick:
CallDll(´cti_usuarios.dll´,´GradeSetores´);
Gostei + 0
16/03/2006
Thomaz_prg
procedure GradeUsuarios; stdcall;
begin
F_GradeUsuarios := TF_GradeUsuarios.Create( Nil );
F_GradeUsuarios.ShowModal;
F_GradeUsuarios.Release;
end;
Gostei + 0
16/03/2006
Martins
Da forma como está descrita acima, quando o form é fechado ele automaticamente liberado da memória, não ficando dependente da liberação da aplicação. Pq ao q parece, ao liberar a DLL com [b:3c70c3d005]freelibrary(HD);[/b:3c70c3d005] ainda existe em memória um form q foi criado dentro da DLL.
Acho q seria isso, alguém poderia corrigir isso por favor, hehe :D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)