Comment effacer un EXE en cours d'utilisation ?

Comment effacer un EXE en cours d'utilisation ? - Programmation

Marsh Posté le 27-04-2001 à 01:21:40    

Salut,
 
Je suis en train de programmer un désinstalleur pour un logiciel que je développe, et je voudrait que le désinstalleur, supprime les fichiers du logiciel, ainsi que lui-même, comment faire, car le désinstalleur étant en cours d'éxecution Windows interdit sa suppression.
 
Merci

Reply

Marsh Posté le 27-04-2001 à 01:21:40   

Reply

Marsh Posté le 27-04-2001 à 08:05:40    

Tiens voilà un bout de code qui créer un executable qui s'effaceras à sa fermeture. Il repose sur l'utilisation du flag  
FILE_FLAG_DELETE_ON_CLOSE pour la fonction CreateFile.
Ce code n'est pas de moi.
**************************************************************
 Module name: DeleteMe.cpp
 Written by: Jeffrey Richter
 Description: Allows an EXEcutable file to delete itself
 ********************************************************************/
 
 #include <Windows.h>
 #include <stdlib.h>
 #include <tchar.h>
 
 /////////////////////////////////////////////////////////////////////
 
 int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n) {
 
    // Is this the original EXE or the clone EXE?
    // If the command-line 1  argument, this is the original EXE
    // If the command-line >1 argument, this is the clone EXE
    if (__argc == 1) {
 
       // Original EXE: Spawn clone EXE to delete this EXE
 
       // Copy this EXEcutable image into the user's temp directory
       TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
       GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
       GetTempPath(_MAX_PATH, szPathClone);
       GetTempFileName(szPathClone, __TEXT("Del" ), 0, szPathClone);  
       CopyFile(szPathOrig, szPathClone, FALSE);
 
       // Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
       HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,                            
 OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
 
       // Spawn the clone EXE passing it our EXE's process handle
       // and the full path name to the original EXE file.
       TCHAR szCmdLine[512];
       HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,                                          
 GetCurrentProcessId());
       wsprintf(szCmdLine, __TEXT("%s %d \"%s\"" ), szPathClone, hProcessOrig,                  
 szPathOrig);
       STARTUPINFO si;
       ZeroMemory(&si, sizeof(si));
       si.cb = sizeof(si);
       PROCESS_INFORMATION pi;
       CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
       CloseHandle(hProcessOrig);
       CloseHandle(hfile);
 
       // This original process can now terminate.
       } else {
 
       // Clone EXE: When original EXE terminates, delete it
       HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
       WaitForSingleObject(hProcessOrig, INFINITE);
       CloseHandle(hProcessOrig);
       DeleteFile(__targv[2]);
       // Insert code here to remove the subdirectory too (if desired).
 
       // The system will delete the clone EXE automatically  
       // because it was opened with FILE_FLAG_DELETE_ON_CLOSE
    }
    return(0);
 }

Reply

Marsh Posté le 27-04-2001 à 09:19:52    

Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed