Fórum Liberar DLL da memória #393845
17/01/2011
0
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
Curtir tópico
+ 0Posts
18/01/2011
Fernando
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
18/01/2011
Leonardo Xavier
//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
18/01/2011
Fernando
Assim que tiver um retorno te falo e finalizo (ou não) o post.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)