carregando dll de modo dinamico, erro ao fechar programa

Delphi

24/10/2008

Fiz uma dll no delphi e chamo ela por outra aplicação minha em delphi tambem.

Se eu carrego essa dll estaticamente, declarando a função dela lá na minha unit, com o nome da dll e tudo mais, funciona perfeitamente.

Se eu carrego em modo dinamico, que era o que eu queria fazer desde o começo, funciona legal, executa a função... mas dá acces violation na hora de fechar o programa.

Descobri que se eu NÃO LIMPAR O HANDLE DA DLL, ou seja, não executar a função FreeLibrary(hDll);, para de dar esse erro ao fechar o programa.

O que eu devo fazer? veja ocódigo:

    try

      try

        try

          try
            hDll := LoadLibrary( PChar( FNomeDll ));
          except
            ShowMessage(´Erro ao carregar arquivo ´ + FNomeDll);
            Exit; //raise; //raise para sair sem executar os try abaixo
          end;

          try
            FuncPtr := GetProcAddress(hDLL, PChar(FNomeFuncao));
            @CallMeDll := FuncPtr;
          except
            ShowMessage(´Erro ao carregar função ´ + FNomeFuncao + ´ em ´ + FNomeDll);
            Exit; //raise; //raise para sair sem executar os try abaixo
          end;

          if @CallMeDll <> nil then
          try

            if cds.IsEmpty then
            begin
              ShowMessage(´Nenhum registro disponível para gerar Lote´);
              Exit;
            end;

            retorno := CallMeDll( FNomeUsuario,
                                  FSecao,
                                  FSubSecao,
                                  cds,
                                  FIBdataBase,
                                  FDescricaoLote,
                                  msg_erro,
                                  vet,
                                  FQuantidadeLotes);

          except
            ShowMessage(´Erro ao executar ´ + FNomeFuncao);
            Exit; //raise; //raise para sair sem executar os try abaixo
          end
          else
          begin
            ShowMessage(´Não foi possível encontrar função ´ + FNomeFuncao + ´ em ´ + FNomeDll);
            Exit;
            //raise Exception.Create(´Não foi possível encontrar função ´ + FNomeFuncao + ´ em ´ + FNomeDll); //raise para sair sem executar os try abaixo
          end;


          if retorno = 0 then
            begin
              Application.MessageBox(msg_erro,´Erro´, mb_OK+mb_ICONERROR);
              exit;
            end;
            msg:=´Lote(s) gerado(s) (total):´+chr(13);
            for i:=0 to retorno-1 do
              msg:=msg+Floattostr(vet[i].ano_lote)+´/´+FloatToStr(vet[i].num_lote)+chr(13);

            Application.MessageBox(PChar(msg),´Atenção´, mb_OK+mb_ICONINFORMATION);

        except
          //tratamento de erro ou sair mostrando mensagem mas sem tratar
        end;
        
      except
      end;

    finally
      //limpeza e descarregamento seguro da dll
      try
          //FreeLibrary(hDll);
      except
      end;
    end;



Vitor Rubio

Vitor Rubio

Curtidas 0

Respostas

Bononi

Bononi

24/10/2008

[quote:9b881393cc=´vitor^_^´]O que eu devo fazer?[/quote:9b881393cc]

Uhn... Já que o Delphi está falindo, faça isso em Java ou em .NET ! :lol:


GOSTEI 0
Vitor Rubio

Vitor Rubio

24/10/2008

em .net eu sei, criando akeles blocos de unsfe code etc e tal, mas em java eu não sei... não estudei java a fundo ainda... mas para isso teria que recompilar minha dll com stdcall.

você pode postar o codigo java aí se não der trabalho, mas eu gostaria mesmo de resolver essa bucha em delphi, pois aki no TRF não se usa Java....


GOSTEI 0
POSTAR