Violação de acesso carregando uma DLL de dentro de outra

Delphi

31/01/2008

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:

    ----------                ------------             -------------
   |          |   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

Prgdelphi

Curtidas 0
POSTAR