Problema com descarregamento de DLL
Bom dia
Estou com um projeto que é composto por um aplicativo e uma dll, ambos utilizam a mesma unit de conexão.
Ao tentar fazer o carregamento(load) da dll e executar funciona normalmente (tirando que notei que a variável global da unit de conexão já está preenchida, mesmo assim crio uma nova instância). Mas na hora de fazer o descarregamento (unload) o aplicativo fica em 100% de processamento e da stack overflow.
Eu queria saber se uma dll feita em delphi pode ter as mesma units dos projeto exe que vai chamá-la ou se alguém sabe como corrigir esse problema.
desde já agradeço
obs: a dll tem um form sendo aberto e fechado em seguida, mas em outras dll que tinha feito que não utilizavam a mesma unit não trava).
Estou com um projeto que é composto por um aplicativo e uma dll, ambos utilizam a mesma unit de conexão.
Ao tentar fazer o carregamento(load) da dll e executar funciona normalmente (tirando que notei que a variável global da unit de conexão já está preenchida, mesmo assim crio uma nova instância). Mas na hora de fazer o descarregamento (unload) o aplicativo fica em 100% de processamento e da stack overflow.
Eu queria saber se uma dll feita em delphi pode ter as mesma units dos projeto exe que vai chamá-la ou se alguém sabe como corrigir esse problema.
desde já agradeço
obs: a dll tem um form sendo aberto e fechado em seguida, mas em outras dll que tinha feito que não utilizavam a mesma unit não trava).
Thales Oliveira
Curtidas 0
Respostas
Joao Ishiwatari
03/11/2016
Eu criei algumas dlls em Delphi 7, com forms, sem forms, e passei por alguns transtornos, mas no final sempre funcionaram bem.
Existem alguns aspectos que você deve observar com relação a dlls no delphi.
Antigamente era necessário adicionar na clausula uses da dll o sharemem da Borland.
as variáveis de retorno e os métodos de invocação das dlls também influenciam. e podem gerar problemas dependendo do que você está fazendo.
Sugiro que de uma pesquisada na internet, tem vários artigos que ajudam a resolver problemas com dlls no delphi.
Existem alguns aspectos que você deve observar com relação a dlls no delphi.
Antigamente era necessário adicionar na clausula uses da dll o sharemem da Borland.
as variáveis de retorno e os métodos de invocação das dlls também influenciam. e podem gerar problemas dependendo do que você está fazendo.
Sugiro que de uma pesquisada na internet, tem vários artigos que ajudam a resolver problemas com dlls no delphi.
GOSTEI 0
Thales Oliveira
03/11/2016
Bom dia obrigado por responder.
Na dll já está informado o ShareMem.
Os parâmetros eu já testei em String e pchar:
function Executar(appHandle : THandle; conexao, parametro: String):String;
e
function Executar(appHandle : THandle; conexao, parametro: Pchar): Pchar;
Eu tentei achar na internet mas como já tinha outras dlls e elas funcionam fiquei com pé atrás. A variável global não estava preenchida não, é falha do debugador (DXE2). Só da falha no FreeLibrary mesmo, quando debuguei o EXE ví que o stack trace fica inúmeras vezes a chamada da função de desregristro.
Na dll já está informado o ShareMem.
Os parâmetros eu já testei em String e pchar:
function Executar(appHandle : THandle; conexao, parametro: String):String;
e
function Executar(appHandle : THandle; conexao, parametro: Pchar): Pchar;
Eu tentei achar na internet mas como já tinha outras dlls e elas funcionam fiquei com pé atrás. A variável global não estava preenchida não, é falha do debugador (DXE2). Só da falha no FreeLibrary mesmo, quando debuguei o EXE ví que o stack trace fica inúmeras vezes a chamada da função de desregristro.
GOSTEI 0
Thales Oliveira
03/11/2016
A função que fica stack overflow é: ntdll.KiUserExceptionDispatcher
GOSTEI 0
Thales Oliveira
03/11/2016
Eu acredito que por causa do EXE e da DLL terem a mesma unit com o mesmo objeto / var (data módulo) isso gere problemas ao tentar fazer o unload. Em debug, a variável já esta preenchida e eu já fiz teste de não criar o data módulo e a tela funcionou normalmente, dando o erro somente no unload.
Estou tentando fazer essa prática pois tenho que criar uma maneira de modularizar o sistema que é muito grande e um forte acoplamento.
Se alguém tiver alguma ideia ficarei muito agradecido.
Estou tentando fazer essa prática pois tenho que criar uma maneira de modularizar o sistema que é muito grande e um forte acoplamento.
Se alguém tiver alguma ideia ficarei muito agradecido.
GOSTEI 0