Fórum Executaveis dentro de DLL ? #327732
18/08/2006
0
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
Curtir tópico
+ 0Posts
18/08/2006
Fabiano Góes
Gostei + 0
18/08/2006
Thiago Vidal
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
18/08/2006
Fabiano Góes
muito obrigado cara, muito util a sua idéia !!!!
valeu !!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)