Folgende Funktion kann verwendet werden, wenn die Anwendung nach der
Ausführung gelöscht werden soll, zum Beispiel zum Aufräumen
der Installations-Datenreste etc.
Beim Aufruf von DeleteExe() wird im Verzeichnis fuer temporäre Daten
eine Batch-Datei Namens delexe.bat erzeugt und gestartet. Die Batch vesucht
(während der Leerlaufphasen des Rechners!) die Programm-Exe zu
entfernen, wobei der Versuch solange wiederholt wird, bis die Datei
gelöscht wird. Danach entfernt sich die auch die delexe.bat
automatisch.
----------- Beispielaufbau der delexe.bat -----------
@echo off
:try
del D:\ARCHIV\WORK\DELEXE\DELETEEXE.EXE
if exist D:\ARCHIV\WORK\DELEXE\DELETEEXE.EXE goto try
del C:\WINDOWS\TEMP\delexe.bat
-----------------------------------------------------
//----------------------------------------------------------
// Funktion DeleteExe() bewirkt, dass das Programm nach der
// Ausfuehrung vom Datenträger entfernt wird
//----------------------------------------------------------
void DeleteExe(void)
{
AnsiString slBatFileName; // fuer den Namen der Batch-Datei
// Der Name der zu löschenden ausführbaren Datei
AnsiString slExeName = ParamStr(0).Pos(" ") ?
"\"" + ParamStr(0) + "\"" : ParamStr(0);
char Buf[MAX_PATH]; // fuer GetEnvironmentVariable()
// Namen des Verzeichnisses fuer temporaere Daten ermitteln:
AnsiString slTmpDir = ((GetEnvironmentVariable(TEXT("TEMP"),
Buf, MAX_PATH) > 0) ? AnsiString(Buf) : EmptyStr);
// Batch-Datei erzeugen und im Temp-Verzeichnis speichern:
TStringList* slBatch = new TStringList;
try
{
if(slBatch != NULL && slTmpDir != EmptyStr)
{
slBatFileName = slTmpDir + "\\delexe.bat";
if(slBatFileName.Pos(" ")) slTmpDir = "\""+slTmpDir + "\"";
slBatch -> Add("@echo off");
slBatch -> Add(":try");
slBatch -> Add("del " + slExeName);
slBatch -> Add("if exist " + slExeName + " goto try");
slBatch -> Add("del " + AnsiString(slBatFileName));
slBatch -> SaveToFile(slBatFileName);
delete slBatch;
}
}
catch(...) { if(slBatch) delete slBatch; }
// Batch-Datei starten:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
// Prozessprioritaet IDLE_PRIORITY_CLASS sorgt dafuer, dass
// die Batchausführung ressourcenschonend waehrend der 'Leerlaufzeit'
// des Rechners stattfindet
CreateProcess(NULL, slBatFileName.c_str(), NULL, NULL, FALSE,
IDLE_PRIORITY_CLASS, NULL, NULL, &si, &pi);
}
|