GARANTIR DESCONTO

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:

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

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar