C++ Builder Snippets  

Die Programm-Exe nach der Ausführung löschen:
 
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);
}



© '99-2002 by S. Kreutzmann