Executaveis dentro de DLL ?
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 ???
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
Curtidas 0
Respostas
Fabiano Góes
18/08/2006
tipo, queria comolar todos os executaveis dentro de uma dll, ai com um aplicativo gerenciador de tarefas eu ia abrindo os executaveis da dll
GOSTEI 0
Thiago Vidal
18/08/2006
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:
para ficar assim:
e no programa principal, usar a seguinte rotina para chamar as DLLs:
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!
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!
GOSTEI 0
Fabiano Góes
18/08/2006
thiago_vidal,
muito obrigado cara, muito util a sua idéia !!!!
valeu !!!
muito obrigado cara, muito util a sua idéia !!!!
valeu !!!
GOSTEI 0