Fórum Como carregar uma dll dinamicamente? #212013

06/02/2004

0

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?


Aledeol

Aledeol

Responder

Posts

06/02/2004

Beppe

Declare uma variável do tipo ExecutaPrograma, e atribua a rotina à ela.


Responder

Gostei + 0

06/02/2004

Aledeol

Valeu, funcionou ok.

Me diz uma coisa, antes de dar o freelibray eu posso executar outras funções dentro desta dll?


Responder

Gostei + 0

06/02/2004

Beppe

Lógico, quantas quiser.


Responder

Gostei + 0

26/08/2004

Czapelini

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


Responder

Gostei + 0

26/08/2004

Beppe

Vc tem os fontes da dll? Deve ser algo na inicialização dela.


Responder

Gostei + 0

26/08/2004

Alexandremarcondes

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;



Responder

Gostei + 0

26/08/2004

Ipc$

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]


Responder

Gostei + 0

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

Aceitar