DLL - substituir dll em uso

Top  Previous  Next

Resumo: 

Ao criar um programa de instalação às vezes é necessário 

que o instalador substitua uma DLL. Entretanto, se ela 

estiver em uso, o Windows não permite que isto seja feito. 

Veja como deve-se fazer para substituir esta DLL no Boot do Windows. 

 

Texto: 

Algum tempo atrás queria criar um pequeno instalador e me deparei 

com o problema de substituição de DLLs. Se ela já estiver em uso 

pelo sistema operacional, o Windows não permite esta substituição.

 

Pesquisando na documentação do MSDN verifiquei que o Windows 

possui um mecanismo para substituir arquivos em uso no próximo 

boot da máquina. É por isso que muitos instaladores requerem que 

a máquina seja reiniciada após a instalação de um software. 

Para realizar esta substituição faça o seguinte:

 

Salve a DLL com outro nome em um diretório temporário 

(deve estar no mesmo DRIVE que a DLL a ser substituida), e 

inclua o seguinte trecho de código em seu instalador.

 

if Win32Platform = VER_PLATFORM_WIN32_NT then

  MoveFileEx( PChar( tempFilenameWithPath ),

              PChar( DLLnameWithpath ), 

              MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT) 

else 

  WritePrivateProfileString('rename', PChar( DLLNameWithpath ),

           PChar( tempFilenameWithPath ), 'wininit.ini' ); 

 

 

No caso de ser um Desinstalador, é possível também excluir um arquivo 

que esteja em uso passando "NULL" no parâmetro de destino do arquivo.