понедельник, 12 марта 2012 г.

Эффективный способ самоудаления

Как exe-шнику удалить самого себя? Есть много способов. Самый эффективный и надежный как оказалось - это связка cmd файла и WScript-скрипта. Начиная с Windows XP можно выполнять WScript-скрипты. Этим и воспользуемся.
Кстати, для чего это может понадобиться? Например, если вы пишете свой Uninstall, то вам потом нужно будет почистить и за собой.
Приступим.

void selfDel()
{
  //Пишем bat-ник во временную папку
  QString tempDir = QDir::tempPath();
  QString temp = QDir::toNativeSeparators(tempDir + "/delhf.bat");
  tempDir = QDir::toNativeSeparators(tempDir);
 
  QFile file(temp);
  if (file.open(QIODevice::WriteOnly | QIODevice::Text))
  {
   QString filePath = qApp->applicationFilePath();
   filePath = QDir::toNativeSeparators(filePath);
   QTextStream out(&file);
   out << ":Repeat" << endl;
   out << QString("del \"%1\" ").arg(filePath) << endl;
   out << QString("del \"%1\"").arg(tempDir + "\\delhf.js") << endl;
   out << QString("if exist \"%1\" goto Repeat").arg(filePath) << endl;
   out << QString("if exist \"%1\" goto Repeat").arg(tempDir + "\\delhf.js") << endl;
   out << QString("del \"%1\"").arg(temp) << endl;
   file.close();
   //Записали скрипт, который удалит себя
   //файл delhf.js
   //и временный батник
 
   //пишем WScript скрипт, который будет вызывать батник
   QFile js(tempDir + "\\delhf.js");
   if (js.open(QIODevice::WriteOnly | QIODevice::Text))
   {
     temp.replace("\\", "\\\\");
     QTextStream out_js(&js); 
     out_js << "
var activex = new ActiveXObject(\"WScript.Shell\");" << endl;
     out_js << QString("activex.Run(\"%1\", 0, true);").arg(temp) << endl;
     js.close();
    
     //вызываем скрипт
     QDesktopServices::openUrl(
      QUrl(QString("file:///%1").arg(tempDir + "\\delhf.js"),
      QUrl::TolerantMode));
   }
  }
}

Вот собственно и весь код.

Комментариев нет:

Отправить комментарий