GARANTIR DESCONTO

Fórum Abrir Form DLL usando LoadLibrary #315166

06/03/2006

0

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

Responder

Posts

07/03/2006

Ermindo

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


Responder

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


Responder

Gostei + 0

14/03/2006

Ermindo

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


Responder

Gostei + 0

14/03/2006

Ermindo

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


Responder

Gostei + 0

14/03/2006

Ermindo

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


Responder

Gostei + 0

14/03/2006

Martins

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!!


Responder

Gostei + 0

15/03/2006

Eniorm

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+


Responder

Gostei + 0

15/03/2006

Eniorm

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+


Responder

Gostei + 0

15/03/2006

Martins

[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!!


Responder

Gostei + 0

15/03/2006

Eniorm

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´);



Responder

Gostei + 0

16/03/2006

Thomaz_prg

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;


Responder

Gostei + 0

16/03/2006

Martins

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar