Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
#1

Самоудаление программы - C++

30.08.2010, 15:00. Просмотров 3696. Ответов 10
Метки нет (Все метки)

возможно ли, удаление самой себя проги сразу после запуска, на крайняк по окончанию работы, и как это осуществить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2010, 15:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Самоудаление программы (C++):

Каким способом сделать самоудаление обьекта из нескольких контейнеров? - C++
Какой способ наиболее эфективный, что бы обьект мог удалить указатели на самого себя из нескольких контейнеров? Есть некий класс и...

Составить блок схему для программы упорядочивания чисел в массиве(код программы прилагается) - C++
#include <iostream> #include <stdlib.h> using namespace std; int main() { int N = 0; // N - количество элементов в массиве...

Программы из самоучителя C++ для чайников выводит ошибку. Как собрать эти же программы, только без ошибки? - C++
На этом форуме уже есть похожие темы, но корректирование этих программ исключив русские символы не дали существенного результата.

Открытие файла другой программы из программы.Косяк. - C++
Итак, есть в программе такой кусок: system("E:\\KMPlayer\\KMPlayer.exe E:\\WINDOWS\\New_year.mp3"); Косяк в том, что пока песня не дойдёт...

Подскажите. Не компилирует текст программы, запрашивает в коде мол не достающую скобку. Ниже приведен текст программы. - C++
#include <iostream.h> unsigned int perimetr ( int a,int b); int main() { int a,b; cin >> a; cin >> b; cout << "perimetr="...

Не понимаю текста программы. Что будет напечатано в результате программы? И что вообще происходит в программе? - C++
class B { int x; B (int a=0) { x = a; cout « 1; } -B () { cout « 3; } }; class D : B { D (int d ) : B (d) {...

10
Black Fregat
1395 / 1026 / 231
Регистрация: 31.05.2009
Сообщений: 4,276
30.08.2010, 15:24 #2
Прямого способа не существует - пока программа работает, ее файл открыт монопольно и удален быть не может.

Мне встречалась статья, в которой приводилось с десяток "обходных" способов.

Лично я создаю и запускаю bat-файл, который в цикле пытается удалить программу, проверяя, удалось ли ему это, а потом удаляет сам себя (для bat-файлов это возможно - интерпретатор закрывает файл перед выполнением команды). Для удаления остается только завершить саму программу.
2
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
30.08.2010, 15:55 #3
Можно создать системный таск, к-рый выполниться через секунду после окончания программы и удалит екзешник.

Добавлено через 24 минуты
Здесь подробнее о Task Scheduler 2.0 - но он появился только в Висте.
http://msdn.microsoft.com/en-us/magazine/cc163350.aspx
1
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
30.08.2010, 19:17  [ТС] #4
можешь написать текст батника если к примеру прога называется name.exe а то я в батниках к сожалению не очень
0
Vladimir616
112 / 112 / 3
Регистрация: 05.07.2009
Сообщений: 224
30.08.2010, 19:44 #5
лендер, а в этом ничего сложного нет:
Batch.bat -
Lisp
1
2
ping -n 1 -w 1000 0.0.0.0 >nul
del name.exe
Здесь первая команда создаёт задержку в 1 секунду, чтобы дать программе закрыться.
name.exe -
C++
1
2
3
4
5
6
7
#include <windows.h>
int main()
{
    //что-то делаем
    ShellExecute(NULL, "open", "Batch.bat", NULL, NULL, NULL);
    return 0;
}
1
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
30.08.2010, 20:47 #6
Цитата Сообщение от Vladimir616 Посмотреть сообщение
ping -n 1 -w 1000 0.0.0.0 >nul
Вместо задержки ругается на неправильный айпишник, с 0.0.0.1 работает вроде.
Цитата Сообщение от Black Fregat Посмотреть сообщение
Прямого способа не существует - пока программа работает, ее файл открыт монопольно и удален быть не может.
Но есть кривой способ: если загнать exeшник в NTFS поток какого-то файла, то этот файл нормально удаляется.
Вот я попробовал написать - если вариант с NTFS потоком прокатывает, то прога перезапускается из нового места и файл удаляется, если не прокатывает - то удаляется после закрытия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstdio>
#include <cstdlib>
#include <string>
#include <windows.h>
 
using namespace std;
 
const char batText[] = ":1\r\n ping -n 1 -w 1000 0.0.0.1\r\n del %1\r\n if exist %1 goto 1\r\n del %0";
const char batName[] = "1.bat";
const char tempName[] = "1.bat:qq.exe";
const char tempNameWithParam[] = "1.bat:qq.exe x2";
 
void Work()
{
    while (1)
        printf("%d ", rand());
}
 
int Execute(const char* cmdLine, WORD visibility)
{
    STARTUPINFO si = {sizeof(STARTUPINFO)};
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = visibility;
    PROCESS_INFORMATION pi;
    BOOL res = CreateProcess(0, const_cast<char*>(cmdLine), 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &si, &pi);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return res;
}
 
int main(int argc, char *argv[])
{
    if (argc >= 2 && strcmp(argv[1], "x2") == 0)
        Work();
 
    FILE* f = fopen(batName, "wb");
    fwrite(batText, 1, sizeof(batText) - 1, f);
    fclose(f);
    Execute((string(batName) + ' ' + argv[0]).c_str(), SW_HIDE);
 
    if (!CopyFile(argv[0], tempName, FALSE) || !Execute(tempNameWithParam, SW_SHOW))
        Work();
}
(ShellExecute название с потоком не переварил)
1
hromjo
1 / 1 / 0
Регистрация: 04.04.2010
Сообщений: 82
30.08.2010, 21:50 #7
Ну не знаю. У меня в ubuntu можно напрямую. Даже apt-get пакет из самого же
Автор темы, ты бы хоть какая система сказал
0
Black Fregat
1395 / 1026 / 231
Регистрация: 31.05.2009
Сообщений: 4,276
30.08.2010, 23:05 #8
Цитата Сообщение от hromjo Посмотреть сообщение
Автор темы, ты бы хоть какая система сказал
Уел, да. Невнимательность налицо - почему-то вопросов о системе не возникло

Добавлено через 6 минут
Цитата Сообщение от лендер Посмотреть сообщение
можешь написать текст батника если к примеру прога называется name.exe а то я в батниках к сожалению не очень
Примерно так:
Код
@echo off
:loop
del Name.exe
if exist Name.exe goto :loop
del %0
Но это сработает, если батник запускать из той же папки, иначе надо полные пути писать
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.08.2010, 23:15 #9
А можно как-то найти указатель на программу в памяти,или на диске,или что-то подобное,загрузить саму программу в память полностью,и уже потом все обращения процесса (или ОС?) сделать не к диску,а в эту область памяти?
Я примерно понимаю,что хочет автор
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
31.08.2010, 10:29 #10
Автор, держи. Прога удаляет сама себя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <windef.h>
#include <WINDOWS.H>
#include <WINBASE.H>
 
void DelSelf(void)
{
           char modulename[MAX_PATH];
           char batfile[MAX_PATH];
           char batlines[MAX_PATH*4];
           LPSTR tempdir;
           char Buf[MAX_PATH];
 
           GetModuleFileName(NULL,modulename,MAX_PATH);
 
           tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
           Buf, MAX_PATH) > 0) ? Buf : NULL);
 
           strcpy(batfile,tempdir);
           strcat(batfile,"\\");
           strcat(batfile,"delself.bat");
           strcpy(batlines,"@echo off\n:try\ndel ");
           strcat(batlines,modulename);
           strcat(batlines,"\nif exist ");
           strcat(batlines,modulename);
           strcat(batlines," goto try\n");
           strcat(batlines,"del ");
           strcat(batlines,batfile);
 
           DWORD NOfBytes;
 
           HANDLE hbf= CreateFile(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);
 
           STARTUPINFO si;
           PROCESS_INFORMATION pi;
           ZeroMemory( &si, sizeof(si) );
           si.cb = sizeof(si);
           si.wShowWindow = SW_HIDE;
           si.dwFlags = STARTF_USESHOWWINDOW;
          
           CreateProcess(
                                           NULL,
                                           batfile,
                                           NULL,
                                           NULL,
                                           FALSE,
                                           IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
                                           NULL,
                                           NULL,
                                           &si,
                                           &pi);
 
}
int main()
{
           DelSelf();
 return 0;
}
Компиль, получившийся экзешник вставляй в любую директорию, в полном имени которой НЕТ ПРОБЕЛОВ.
Русские буквы канают
ПОсле запускай экзешник и смотри, как он исчезнет.
Пиши.

Добавлено через 16 минут
Код не мой, но мы же здесь вроде как одна семья?!
1
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
31.08.2010, 14:20 #11
Поправка: строка 39
C++
1
    Execute((string(batName) + " \"" + argv[0] + "\"").c_str(), SW_SHOW);
А то с путём с пробелами не работает. Хотя вся равно в варианте с bat файлом будут проблемы с символами, которых в досовской кодировке нет. Например, если в пути есть "©", то он заменит его на "c" и зависнет в цикле удаления.
1
31.08.2010, 14:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2010, 14:20
Привет! Вот еще темы с ответами:

Дан текст программы на С++...Записать в выходной файл текст программы без комментариев - C++
( структуры и текстовые файлы)– Чтение данных в массив структур должно производиться из входного текстового файла. Дан текст...

Самоудаление программы - C#
Цель: программа запускается { делает что-нибудь } закрывается и удаляется удаление нужно произвести как можно более...

Самоудаление программы - Delphi
Как можно реализовать самоудаления запущенной программы без указания пути до нее

Самоудаление программы - C#
Пробывал вот такой код: ( не работает ) private void button1_Click(object sender, EventArgs e) { ProcessStartInfo Info = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.