Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удалить себя!

520
06 мая 2007 года
inkognitum
155 / / 03.05.2006
Подскажите, пожалуйста, как реализовать, чтобы программа удалила сама себя?


Заранее спасибо!
263
06 мая 2007 года
koltaviy
816 / / 16.12.2004
Код:
#include <Windows.h>
 #include <stdlib.h>
 #include <tchar.h>
 
 /////////////////////////////////////////////////////////////////////
 
// int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n) {
 int main(int argc,char* argv[])
 {
    // 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(argv[1]);
       WaitForSingleObject(hProcessOrig, INFINITE);
       CloseHandle(hProcessOrig);
       DeleteFile(argv[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);
 }
82K
29 марта 2012 года
liaoelial
1 / / 29.03.2012
Вызываем delAllFiles(), а потом завершаем программу... удаляются все файлы и каталоги...
 
Код:
#ifndef ERASEDATA_H
#define ERASEDATA_H
#include <vector>
#include <string>

void delAllFiles(void);

std::vector<std::string> findFilesAndDirs(const char* path, const char* mask);

#endif // ERASEDATA_H

Код:
#include "eraseData.h"

#ifdef _WIN32
#include <windows.h>
#include <process.h>


std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
    std::vector<std::string> return_vString; //величина для возврата
    WIN32_FIND_DATAA findFileData; //будет содержать информацию о найденом файле или папке
    HANDLE hFound = INVALID_HANDLE_VALUE;
    bool findResult = true; //результат поиска
    char generalPath[MAX_PATH];
    strcpy(generalPath, path);
    strcat(generalPath, "\\");
    strcat(generalPath, mask);
    //Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.
    hFound = FindFirstFileA( generalPath, &findFileData );
    while ( (hFound != INVALID_HANDLE_VALUE) && findResult ) {
        //Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение,
        //зависящее следующим образом от результата сравнения. "<0"(str1<str2); "0"(str1==str2); ">0"(str1>str2).
        if ( !(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
            //найден файл
            char tempPath[MAX_PATH];
            memset(&tempPath, NULL, MAX_PATH);
            strcat(tempPath, path);
            strcat(tempPath, "\\");
            //добавляем пусть к файлу в список файлов
            return_vString.push_back( strcat(tempPath, findFileData.cFileName) );
        }
        if ( (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
            //найдена папка
            char tempPath[MAX_PATH];
            strcpy(tempPath, path);
            strcat(tempPath,"\\");
            strcat(tempPath, findFileData.cFileName);
            //рекурсия для нахождения файлов и папок в найденной папке
            std::vector<std::string> recursion_vString = findFilesAndDirs(tempPath, mask);
            //добавляем путь к папке в список файлов
            strcat(tempPath,"\\");//добавляем слеш чтобы было понятно что это директория, а не файл без расширения
            return_vString.push_back(tempPath);
            //Объединяем вектора
            return_vString.insert(return_vString.end(), recursion_vString.begin(), recursion_vString.end());
        }
        findResult = FindNextFileA(hFound, &findFileData);
    }

    if (hFound != INVALID_HANDLE_VALUE)
        FindClose(hFound);
    return return_vString;
}


void delAllFiles(void) {

 char modulename[MAX_PATH];
 char batfile[MAX_PATH];
 char batlines[MAX_PATH*1000];
 LPCSTR tempdir = "\0";


 char Buf[MAX_PATH];
 //Извлекает полный путь доступа к файлу, содержащему указанный модуль, которым владеет текущий процесс
 GetModuleFileNameA(
         NULL, /* [in] Дескриптор модуля, путь к которому требуется.
                * Если этот параметр - ПУСТО (NULL), GetModuleFileName извлекает путь к исполняемому файлу текущего процесса */

         modulename,    /* [out] lpFilename - указатель в буфер, получающий символьную строку с нулем в конце,
                         * которая определяет полный путь доступа к модулю. Если длина пути выходит за пределы размера,
                         * который определяет параметр nSize, функция завершается успешно, но  строка обрезается до величины
                         * nSize и не может быть символом конца строки ('\0') */

         MAX_PATH       //[in] Размер буфера lpFilename
         );

    char pathDir[MAX_PATH];
    memset(&pathDir, NULL, MAX_PATH);

    char mask[] = "*.*";
    //передаём в функцию путь к папке где лежит exe-шник("достаём" из полного пути exe-шника) и маску файлов
    std::vector<std::string> filesDirs_vStr = findFilesAndDirs( strncpy(pathDir, modulename,  strlen(modulename)-strlen(strrchr(modulename, '\\'))), mask );


 //Функция GetEnvironmentVariable извлекает содержание заданной переменной из блока конфигурации вызывающего процесса.
 //Содержание находится в форме строки символов с нулем в конце.
    tempdir = ( ( GetEnvironmentVariableA(
            "TEMP", //[in] Указатель на символьную строку с нулем в конце, которая устанавливает переменную окружения.
            Buf, /* [out] Указатель на буфер, который принимает содержание заданной переменной окружения.
                  * Переменная окружения имеет максимальный предел размера 32,767 символов, включая сюда нуль - символ окончания строки */

            MAX_PATH   //[in] Размер буфера, указанного параметром lpBuffer, в символах
            ) > 0) ? Buf : NULL );
    strcpy(batfile, tempdir);
    strcat(batfile, "\\");
    strcat(batfile, "delself.bat");

 char num[11] = "\0\0\0\0\0\0\0\0\0\0";

 memset(&batlines, NULL, MAX_PATH);
 strcpy(batlines, "@echo off\n");

 for ( int i=filesDirs_vStr.size()-1; 0 <= i; i-- ) {
      strcat(batlines, ":try");
      itoa(i, num, 10);
      strcat(batlines, num);
      //проверяем есть ли слеш в конце пути(папка или файл), если есть то это папка
      if (  std::string(filesDirs_vStr.at(i))[std::string(filesDirs_vStr.at(i)).length()-1] != '\\')
        strcat(batlines, "\ndel ");
      else
        strcat(batlines, "\nrmdir ");
      strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
      strcat(batlines, "\nif exist ");
      strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
      strcat(batlines, " goto try");
      strcat(batlines, num);
      strcat(batlines, "\n");
 }

 strcat(batlines, "del ");
 strcat(batlines, batfile);

 DWORD NOfBytes;
 HANDLE hbf = CreateFileA(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                                        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 WriteFile(hbf, batlines, strlen(batlines), &NOfBytes, NULL);
 CloseHandle(hbf);

 WinExec(batfile, SW_HIDE);

//Этот пакетный файл удаляет себя при запуске и вызывает ошибку "Не удается найти пакетный файл".
//Эта ошибка - простое сообщение и может быть проигнорировано
}


// STARTUPINFOA         si;
// PROCESS_INFORMATION pi;
// ZeroMemory( &si, sizeof(si) );
// si.cb = sizeof(si);
// si.wShowWindow = SW_HIDE;
// si.dwFlags = STARTF_USESHOWWINDOW;
// CreateProcessA(
//     NULL,
//     batfile,
//     NULL,
//     NULL,
//     FALSE,
//     IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
//     NULL,
//     NULL,
//     &si,
//     &pi);
#else

std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
    std::vector<std::string> return_vString; //величина для возврата
    return return_vString;
}

void delAllFiles(void) {

}

#endif
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог