Como carregar uma dll dinamicamente?
Galera dentro de uma dll q criei existem funçoes e procedures que exporto.
Usando o método de carregamento estático tudo funciona ok.
Mas agora quero carregar dinamicamente a dll. Sei que devo usar o processo Loadlibrary.
Mas não consigo executar as procedures que recebem parâmetros e nem as funções.
Vejam como faço:
type
ExecutaPrograma = procedure (PindicePrg : Integer);
implementation
procedure TForm1.listaClick(Sender: TObject);
var
Area : Integer;
Handle : THandle;
begin
Handle := LoadLibrary (´cortedll.dll´);
if Handle <> 0 then
begin
@ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´);
if @ExecutaPrograma <> nil then
begin
ExecutaPrograma(lista.Selected.index);
end;
FreeLibrary (Handle);
end;
end;
Na hora de compilar ele dá erro dizendo que
´(´ expected but ´:=´ found. Na linha
@ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´);
Como faço para executar esta procedure ou qq rotina que receba parametros?
Usando o método de carregamento estático tudo funciona ok.
Mas agora quero carregar dinamicamente a dll. Sei que devo usar o processo Loadlibrary.
Mas não consigo executar as procedures que recebem parâmetros e nem as funções.
Vejam como faço:
type
ExecutaPrograma = procedure (PindicePrg : Integer);
implementation
procedure TForm1.listaClick(Sender: TObject);
var
Area : Integer;
Handle : THandle;
begin
Handle := LoadLibrary (´cortedll.dll´);
if Handle <> 0 then
begin
@ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´);
if @ExecutaPrograma <> nil then
begin
ExecutaPrograma(lista.Selected.index);
end;
FreeLibrary (Handle);
end;
end;
Na hora de compilar ele dá erro dizendo que
´(´ expected but ´:=´ found. Na linha
@ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´);
Como faço para executar esta procedure ou qq rotina que receba parametros?
Aledeol
Curtidas 0
Respostas
Beppe
06/02/2004
Declare uma variável do tipo ExecutaPrograma, e atribua a rotina à ela.
GOSTEI 0
Aledeol
06/02/2004
Valeu, funcionou ok.
Me diz uma coisa, antes de dar o freelibray eu posso executar outras funções dentro desta dll?
Me diz uma coisa, antes de dar o freelibray eu posso executar outras funções dentro desta dll?
GOSTEI 0
Beppe
06/02/2004
Lógico, quantas quiser.
GOSTEI 0
Czapelini
06/02/2004
Olá,
Fiz exatamente como vcs indicaram, mas está dando um erro na linha
LibHandle := LoadLibrary (´DllInscE32.Dll´).
Dá o erro dizendo que ´F´ não eh um valor inteiro... e em nehum momento existe F....
Alguém tem idéia do que pode ser?
Obrigado
Fiz exatamente como vcs indicaram, mas está dando um erro na linha
LibHandle := LoadLibrary (´DllInscE32.Dll´).
Dá o erro dizendo que ´F´ não eh um valor inteiro... e em nehum momento existe F....
Alguém tem idéia do que pode ser?
Obrigado
GOSTEI 0
Beppe
06/02/2004
Vc tem os fontes da dll? Deve ser algo na inicialização dela.
GOSTEI 0
Alexandremarcondes
06/02/2004
begin
@ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´);
if @ExecutaPrograma <> nil then
begin
ExecutaPrograma(lista.Selected.index);
end;
FreeLibrary (Handle);
end;
Esa aprte deveria ser assim:
begin ExecutaPrograma := GetProcAddress (Handle, ´ExecutaPrograma´); if @ExecutaPrograma <> nil then begin ExecutaPrograma(lista.Selected.index); end; FreeLibrary (Handle); end;
GOSTEI 0
Ipc$
06/02/2004
Neste caso tanto faz vc atribuir GetProcAddress à ExecutaPrograma ou @ExecutaPrograma, pq ExecutaPrograma é um ponteiro sem tipo, ou, não tipado.
Quando vc utiliza por ex: @String, vc tem o endereço de memória da variável tipo String.
Para vc ter o endereço de memória da [b:a5131feab2]variável[/b:a5131feab2] ExecutaPrograma, vc tem que utilizar [b:a5131feab2]@@[/b:a5131feab2]ExecutaPrograma.
[/b]
Quando vc utiliza por ex: @String, vc tem o endereço de memória da variável tipo String.
Para vc ter o endereço de memória da [b:a5131feab2]variável[/b:a5131feab2] ExecutaPrograma, vc tem que utilizar [b:a5131feab2]@@[/b:a5131feab2]ExecutaPrograma.
[/b]
GOSTEI 0