Fórum Violação de acesso carregando uma DLL de dentro de outra #352805
31/01/2008
0
Pessoal, seguinte.. estou com um problema que não consigo entender o porque de estar acontecendo.
Eu tenho um programa que faz uma chamada a uma dll dinamicamente.. e em certo ponto, dentro desta dll que o programa chamou, é chamada outra dll ainda, também dinamicamente. Acontece que sempre quando a execução do procedimento chamado na primeira dll termina, ocorre uma vioalação de acesso. Meu programa está estruturado assim:
Dentro do programa estou chamando a dll da seguinte maneira:
(os códigos são apenas demonstrativos)
Ao chamar a função FnDLL, ela efetua um cálculo e dependendo do resultado, precisa chamar outra função, disponível em outra dll. Dentro desta primeira DLL estou fazendo um código identico a esse, mas referenciando a segunda DLL para chamá-la dinamicamente. Assim:
O problema ocorre no seguinte caso: Dentro da primeira DLL, logo apos eu chamar a segunda e executar a sua função, quando dou o FreeLibrary, ele libera normalmente a DLL2, mas quando termina a execução da DLL1, o programa gera uma exception de violação de acesso. Logo depois do [i:9d2b2fd6ee]End.[/i:9d2b2fd6ee] da primeira DLL.
Se por acaso eu entrar na dll1 e comentar a linha do FreeLibrary, onde ele libera a segunda DLL, aí nenhum erro de violação de acesso ocorre, porém, a DLL 2 fica ´presa´ no windows. Eu não consigo alterá-la nem excluí-la por exemplo, o que significa que ela ainda está ocupando algum lugar da memória.
Nos dois casos, a DLL 1 fica liberada, porque o comando FreeLibrary chamado de dentro do programa a libera.
Consegui passar meu problema? Será que alguém pode me dar uma ajuda? Por enquanto, na DLL, a linha de FreeLibrary está comentada, para evitar o erro. mas eu preciso acertar, para que a DLL 2 não fique carregada na memoria.
Detalhe: se eu chamar a 2ª DLL direto do meu programa, sem passar pela primeira, não ocorre o erro. Mas não posso fazer assim, ele deve obrigatoriamente passar na 1ª DLL antes
Eu tenho um programa que faz uma chamada a uma dll dinamicamente.. e em certo ponto, dentro desta dll que o programa chamou, é chamada outra dll ainda, também dinamicamente. Acontece que sempre quando a execução do procedimento chamado na primeira dll termina, ocorre uma vioalação de acesso. Meu programa está estruturado assim:
---------- ------------ ------------- | | chama | | chama | | | Programa | ----> | DLL 1 | -----> | DLL 2 | |__________| |____________| |_____________|
Dentro do programa estou chamando a dll da seguinte maneira:
(os códigos são apenas demonstrativos)
type TFnDLL = function (parametros : integer) : integer; stdcall; function ChamaDLL1() : integer; var FnDLL : TFnDLL; LibHandle : THandle; begin LibHandle := SafeLoadLibrary(Pchar(Trim(pasta + ´ArquivoDLL1.dll´))); try if LibHandle <= HINSTANCE_ERROR then begin Result := -1; exit; end; @FnDLL := GetProcAddress(LibHandle,pchar(´FuncaoDaDLL´)); if @FnDLL = nil then begin Result := -1; exit; end; Result := FnDLL(1221); finally if LibHandle <> 0 then FreeLibrary(LibHandle); end; end;
Ao chamar a função FnDLL, ela efetua um cálculo e dependendo do resultado, precisa chamar outra função, disponível em outra dll. Dentro desta primeira DLL estou fazendo um código identico a esse, mas referenciando a segunda DLL para chamá-la dinamicamente. Assim:
type TFnDLL2 = function (parametros : integer) : integer; stdcall; function ChamaDLL2() : integer; var FnDLL2 : TFnDLL2; LibHandle : THandle; begin LibHandle := SafeLoadLibrary(Pchar(Trim(pasta + ´ArquivoDLL2.dll´))); try if LibHandle <= HINSTANCE_ERROR then begin Result := -1; exit; end; @FnDLL2 := GetProcAddress(LibHandle,pchar(´FuncaoDaDLL2´)); if @FnDLL2 = nil then begin Result := -1; exit; end; Result := FnDLL2(121); finally if LibHandle <> 0 then FreeLibrary(LibHandle); end; end;
O problema ocorre no seguinte caso: Dentro da primeira DLL, logo apos eu chamar a segunda e executar a sua função, quando dou o FreeLibrary, ele libera normalmente a DLL2, mas quando termina a execução da DLL1, o programa gera uma exception de violação de acesso. Logo depois do [i:9d2b2fd6ee]End.[/i:9d2b2fd6ee] da primeira DLL.
Se por acaso eu entrar na dll1 e comentar a linha do FreeLibrary, onde ele libera a segunda DLL, aí nenhum erro de violação de acesso ocorre, porém, a DLL 2 fica ´presa´ no windows. Eu não consigo alterá-la nem excluí-la por exemplo, o que significa que ela ainda está ocupando algum lugar da memória.
Nos dois casos, a DLL 1 fica liberada, porque o comando FreeLibrary chamado de dentro do programa a libera.
Consegui passar meu problema? Será que alguém pode me dar uma ajuda? Por enquanto, na DLL, a linha de FreeLibrary está comentada, para evitar o erro. mas eu preciso acertar, para que a DLL 2 não fique carregada na memoria.
Detalhe: se eu chamar a 2ª DLL direto do meu programa, sem passar pela primeira, não ocorre o erro. Mas não posso fazer assim, ele deve obrigatoriamente passar na 1ª DLL antes
Prgdelphi
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)