Fórum carregando dll de modo dinamico, erro ao fechar programa #365460
24/10/2008
0
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:
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
Curtir tópico
+ 0
Responder
Posts
24/10/2008
Bononi
[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:
Uhn... Já que o Delphi está falindo, faça isso em Java ou em .NET ! :lol:
Responder
Gostei + 0
24/10/2008
Vitor Rubio
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....
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....
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)