Liberar DLL da memória
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.
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
Curtidas 0
Respostas
Fernando
17/01/2011
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.
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.
GOSTEI 0
Leonardo Xavier
17/01/2011
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;
GOSTEI 0
Fernando
17/01/2011
Obrigado Leonardo.
Assim que tiver um retorno te falo e finalizo (ou não) o post.
Assim que tiver um retorno te falo e finalizo (ou não) o post.
GOSTEI 0