Fórum Executaveis dentro de DLL ? #327732

18/08/2006

0

Bom pessoal,
tenho um sistema com varios módulos, separados por executáveis cada módulo um executavel.

gostaria de saber se tem como colocar esses executaveis em DLL ???


Fabiano Góes

Fabiano Góes

Responder

Posts

18/08/2006

Fabiano Góes

tipo, queria comolar todos os executaveis dentro de uma dll, ai com um aplicativo gerenciador de tarefas eu ia abrindo os executaveis da dll


Responder

Gostei + 0

18/08/2006

Thiago Vidal

esta é uma ótima prática, eu também faço muito disso, assim vc pode atualizar apenas uma DLL, sem precisar transferir o sistema como um todo. e também, pode até personalizar a compilação de uma ou outra DLL para um determinado cliente.

Bom, para fazer isso, supondo que o seu executavel se chame Project1 e seu form principal se chama TForm1:
O Arquivo DPR começa assim:
program Project1;

uses
  Forms,
  Unit1 in ´Unit1.pas´ ;

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


para ficar assim:
library Project1;

uses
  SysUtils,
  Classes,
  Forms,
  Unit1 in ´Unit1.pas´ ;

{$R *.res}

procedure Iniciar; stdcall;
begin
  with TForm1.Create(Application) do
  try
    ShowModal;
  finally
    Free;
  end;
end;

exports
  Iniciar;

begin
end.


e no programa principal, usar a seguinte rotina para chamar as DLLs:
procedure TForm1.AbreDLL(FileName: TFileName);
var
  DLL: THandle;
  Iniciar: procedure; stdcall;
begin
  DLL := LoadLibrary(PChar(FileName));
  if (DLL = 0) then
    RaiseLastOSError;
    
  try
    @Iniciar := GetProcAddress(DLL, ´Iniciar´);
    if (@Iniciar = nil) then
      RaiseLastOSError;

    Iniciar;
  finally
    FreeLibrary(DLL);
  end;
end;


Recomendo não alterar o arquivo DPR diretamente, o ideal seria iniciar um novo projeto (DLL Wizard) e adicionar as Units do projeto.

Desta forma, todas as DLLs deveriam ter uma rotina chamada ´Iniciar´ de forma que qualquer uma poderia ser chamada do mesmo modo. A rotina pode ter qualquer nome, desde que seja corretamente colocada na cláusula ´exports´ da DLL e no método ´GetProcAddress´ da rotina que a chama.

No meu caso, ao invés de procedure, utilizo uma function: Boolean, e na chamada da DLL, a linha do ShowModal fica Result := (ShowModal = mrOk) que retorna True se a pessoa clicar no botão padrão, desta forma vc sempre poderá retornar um dado para o usuário.

Lembrando apenas que usando a convenção ´stdcall´ vc poderá enviar parametros e receber resultados da DLL, desde que nao sejam strings ou arrays dinamicas. Se precisar trocar dados deste tipo, deixe uma mensagem que eu posto um exemplo prático, sem precisar da unit ShareMem que o Delphi recomenda.

No mais, qualquer dúvida, estou à disposição!


Responder

Gostei + 0

18/08/2006

Fabiano Góes

thiago_vidal,

muito obrigado cara, muito util a sua idéia !!!!

valeu !!!


Responder

Gostei + 0

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

Aceitar