Introduction
Uninstall programs typically want to delete themselves at the end of the
un-installation, but executable cannot delete itself by simply calling the
DeleteFile
function. By calling the Selfdestruct()
function showed below before program exit, the calling executable will be
destroyed as soon as possible. The method shown in this article works on all
Win32 platforms and there is no need to reboot.
Using the code
Just call the Selfdestruct()
function before program exit.
Hide Shrink
Copy Code static const char tempbatname[] = "_uninsep.bat" ;
void Selfdestruct()
{
static char templ[] =
":Repeat\r\n"
"del \"%s\"\r\n"
"if exist \"%s\" goto Repeat\r\n"
"rmdir \"%s\"\r\n"
"del \"%s\"" ;
char modulename[_MAX_PATH] ; char temppath[_MAX_PATH] ; char folder[_MAX_PATH] ;
GetTempPath(_MAX_PATH, temppath) ;
strcat(temppath, tempbatname) ;
GetModuleFileName(NULL, modulename, MAX_PATH) ;
strcpy (folder, modulename) ;
char *pb = strrchr(folder, '\\');
if (pb != NULL)
*pb = 0 ;
HANDLE hf ;
hf = CreateFile(temppath, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
if (hf != INVALID_HANDLE_VALUE)
{
DWORD len ;
char *bat ;
bat = (char*)alloca(strlen(templ) +
strlen(modulename) * 2 + strlen(temppath) + 20) ;
wsprintf(bat, templ, modulename, modulename, folder, temppath) ;
WriteFile(hf, bat, strlen(bat), &len, NULL) ;
CloseHandle(hf) ;
ShellExecute(NULL, "open", temppath, NULL, NULL, SW_HIDE);
}
}
How it works
Let's assume the executable that wants to destroy itself is located in
c:\myfolder\selfdestruct.exe. The Selfdestruct()
function
will create following .bat in the computers temp folder and then launches it:
Hide Copy Code
:Repeat
del "c:\myfolder\selfdestruct.exe"
if exist "c:\myfolder\selfdestruct.exe" goto Repeat
rmdir "c:\myfolder"
del "c:\temp\_uninsep.bat" ;
The .bat file will try to delete the c:\myfolder\selfdestruct.exe over
and over until it finally succeeds (that is as soon as selfdestruct.exe
has finished execution. Then it tries to remove the containing folder (here
c:\myfolder) which will work only if it is empty and finally deletes
itself. Fortunately .bat files can delete themselves.