Abrir Form DLL usando LoadLibrary

Delphi

06/03/2006

Olá pessoal, estou com um problema

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

Eniorm

Curtidas 0

Respostas

Ermindo

Ermindo

06/03/2006

Olá,
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
Eniorm

Eniorm

06/03/2006

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
Ermindo

Ermindo

06/03/2006

pasei pelo mesmo problema e descobri q precisa declarar o Sharemem como primeira clausula do Uses no *.DPR e naum no Form da aplicação principal.

[]1 Ermindo


GOSTEI 0
Ermindo

Ermindo

06/03/2006

passei pelo mesmo problema e descobri q precisa declarar o Sharemem como primeira clausula do Uses no *.DPR e naum no Form da aplicação principal.

[]´ Ermindo


GOSTEI 0
Ermindo

Ermindo

06/03/2006

passei pelo mesmo problema e descobri q precisa declarar o Sharemem como primeira clausula do Uses no *.DPR e naum no Form da aplicação principal.

[]´ Ermindo


GOSTEI 0
Martins

Martins

06/03/2006

passei pelo mesmo problema e descobri q precisa declarar o Sharemem como primeira clausula do Uses no *.DPR e naum no Form da aplicação principal. []´ Ermindo


Se vc vai usar ShareMem, inclua da DLL e no DPR OK!!


GOSTEI 0
Eniorm

Eniorm

06/03/2006

O problema continua,

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
Eniorm

Eniorm

06/03/2006

O problema continua,

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
Martins

Martins

06/03/2006

[quote:76bae26c8f=´Enio Marconcini´]O problema continua,

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
Eniorm

Eniorm

06/03/2006

Procedimento pra chamar o form (na dll)

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
Thomaz_prg

Thomaz_prg

06/03/2006

Colega, pode ser que eu esteja enganado, mas tente criar seu form assim:

procedure GradeUsuarios; stdcall;
begin
F_GradeUsuarios := TF_GradeUsuarios.Create( Nil );
F_GradeUsuarios.ShowModal;
F_GradeUsuarios.Release;
end;


GOSTEI 0
Martins

Martins

06/03/2006

Colega, pode ser que eu esteja enganado, mas tente criar seu form assim: procedure GradeUsuarios; stdcall; begin F_GradeUsuarios := TF_GradeUsuarios.Create( Nil ); F_GradeUsuarios.ShowModal; F_GradeUsuarios.Release; end;


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
POSTAR