Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Sostituire files utilizzati dal sistema


Questo articolo non espone un programma, una procedura od un componente; si limita fondamentalmente a segnalare un'api Win32 che può far comodo in determinate situazioni. Vediamo nel seguito quali.

1. Il file è usato dal sistema ma io lo voglio sostituire con una versione più aggiornata

Spesso in seguito ad una installazione, ci viene chiesto di riavviare il computer per completare l' installazione stessa. Questo perchè l' installazione deve sostituire dei file con delle nuove versioni, ma i file in questione non sono accessibili perchè in uso. Come fa il programma di installazione a dire al sistema operativo di sostituire determinati file al riavvio successivo? Si può usare l' API win32 MoveFileEx

2. MoveFileEx

L'api win32 MoveFileEx sposta un file o una directory (a patto che esistano già)

function MoveFileEx(lpExistingFileName: PChar; lpNewFileName: PChar; dwFlags: cardinal ): boolean; stdcall;

  • lpExistingFileName: [input] nome file che si vuole spostare
  • lpNewFileName [input] nome file destinazione (può indicare un file che esiste già)
  • dwFlags: [input] comportamento adottato dalla funzione; a noi interessa sostituire un file utilizzato dal sistema (quindi come lpNewFileName useremo il nome del file che vogliamo sostituire) ed in questo contesto ci viene in aiuto il valore MOVEFILE_DELAY_UNTIL_REBOOT: dice al sistema di eseguire lo spostamento al boot successivo

In pratica dwFlags è la chiave di tutto: impostandolo a MOVEFILE_DELAY_UNTIL_REBOOT, dice al sistema di eseguire lo spostamento al boot successivo. lpExistingFileName rappresenta il nome del file sorgente mentre lpNewFileName rappresenta il nome del file destinazione (che nel nostro caso dovrebbe essere già esistente ed in uso quindi non sostituibile immediatemente). Se lpNewFileName è nullo allora al boot successivo il file sorgente verrà eliminato. Come fa Windows a sapere cosa fare al boot successivo? Semplice: la funzione MoveFileEx, se chiamata con il parametro dwFlags settato a MOVEFILE_DELAY_UNTIL_REBOOT, scrive le coppie Sorgente-Destinazione nel registro in un valore di nome PendingFileRenameOperations della chiave seguente

HKey_Local_Machine\CurrentControlSet\Control\Session Manager

Tale valore è di tipo REG_MULTI_SZ (per chi ha Windows 2000 il contenuto di tale tipo di valore può essere visualizzato utilizzando regedt32.exe).

Ad esempio quando tanto tempo fa avevo installato la patch 867801 il contenuto di tale valore (prima di riavviare il pc come richiesto dall'installer) era il seguente:

\??\C:\WINNT\Temp\OLD14C.tmp \??\C:\WINNT\Temp\OLD14B.tmp \??\C:\WINNT\system32\SET15F.tmp !\??\C:\WINNT\system32\WININET.DLL \??\C:\WINNT\system32\SET161.tmp !\??\C:\WINNT\system32\SHDOCVW.DLL \??\C:\WINNT\system32\SET163.tmp !\??\C:\WINNT\system32\SHLWAPI.DLL \??\C:\WINNT\system32\SET165.tmp !\??\C:\WINNT\system32\BROWSEUI.DLL \??\C:\WINNT\system32\SET167.tmp !\??\C:\WINNT\system32\URLMON.DLL \??\C:\WINNT\system32\SET169.tmp !\??\C:\WINNT\system32\MSHTML.DLL

Il significato è il seguente: al boot successivo verranno eseguite le seguenti operazioni
 

Eliminazione di C:\WINNT\Temp\OLD14C.tmp Eliminazione di C:\WINNT\Temp\OLD14B.tmp C:\WINNT\system32\SET15F.tmp diventa il nuovo C:\WINNT\system32\WININET.DLL C:\WINNT\system32\SET161.tmp diventa il nuovo C:\WINNT\system32\SHDOCVW.DLL C:\WINNT\system32\SET163.tmp diventa il nuovo C:\WINNT\system32\SHWAPI.DLL C:\WINNT\system32\SET165.tmp diventa il nuovo C:\WINNT\system32\BROWSEUI.DLL C:\WINNT\system32\SET167.tmp diventa il nuovo C:\WINNT\system32\URLMON.DLL C:\WINNT\system32\SET169.tmp diventa il nuovo C:\WINNT\system32\MSHTML.DLL

 

 

 

 





 

 

 

 

 

 

 

 

 

 

 
 
Your Ad Here