Fórum Liberar DLL da memória #393845

17/01/2011

0

Olá amigos,

Gostaria de saber como eu faço para liberar da memória uma determinada DLL? Não posso utilizar o FreeLibrary, porque não tenho o valor do handle retornado pela função LoadLibrary, ou seja, quem carregou a DLL na memória não foi minha aplicação e sim uma outra.

Preciso disso porque está dando conflitos entre as DLLs libeay32.dll, usada para assinar arquivos do PAF-ECF (v0.9.8.6) e para enviar e-mails via Indy (v0.9.6).

Obrigado.
Fernando

Fernando

Responder

Posts

18/01/2011

Fernando

Na verdade, a situação é a seguinte:

Meu sistema envia e-mails sem problemas através do Indy (Delphi 7 + Indy que vem na instalação padrão), usando as DLLs libeay32.dll e ssleay32.dll (versão 0.9.6). Porém, o sistema também usa a DLL da bematech (BemaFI32.dll), que por sua vez chama a libeay32.dll (versão 0.9.8.6) para a assinatura digital dos arquivos.

Como as DLLs possuem o mesmo nome (libeay32.dll), mesmo eu colocando em diretórios diferentes, o Windows acha que é a mesma DLL, gerando conflitos. Alterei o fonte do Indy para pegar as DLLs de um diretório fixo (ex: C:\sistema\DLL) e funciona ok, e coloquei a libeay32.dll da bematech em system32.

Mas o funcionamento é que, qual DLL for carregada primeiro é que vai ficar em memória. 
Responder

Gostei + 0

18/01/2011

Leonardo Xavier

Você ja tentou "matar" o processo de suas dll antes de chamar sua róxima função?


//declarar a TLHELP32 no uses do projeto
//uses

//Tlhelp32;
procedure MatarProcesso(hWindowHandle: HWND);

var

  hprocessID: INTEGER;

  processHandle: THandle;

  DWResult: DWORD;

begin

  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,

    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);



  if isWindow(hWindowHandle) then

  begin

    // PostMessage(hWindowHandle, WM_QUIT, 0, 0);



    { Pega o processo identificado na janela}

    GetWindowThreadProcessID(hWindowHandle, @hprocessID);

    if hprocessID <> 0 then

    begin

      { Pega o handle do processo }

      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,

        False, hprocessID);

      if processHandle <> 0 then

      begin

        { "Mata" o processo }

        TerminateProcess(processHandle, 0);

        CloseHandle(ProcessHandle);

      end;

    end;

  end;

end;

//como utilizar
procedure TForm1.Button2Click(Sender: TObject);

begin

  MatarProcesso(FindWindow('word',nil));

end;

Responder

Gostei + 0

18/01/2011

Fernando

Obrigado Leonardo.

Assim que tiver um retorno te falo e finalizo (ou não) o post.
Responder

Gostei + 0

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

Aceitar