C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как самоуничтожить программу?, При выполнении
Дмитрий
  Отправлено: 30.11.2003, 03:23


Не зарегистрирован







Подскажите пожалуйста, как можно программно удалить безвозвратно несколько папок и файлов, включая сам выполняемый файл?
** pasha
Отправлено: 30.11.2003, 23:13


Не зарегистрирован








Можно через SHFileOperation() + FO_DELETE:

CODE

char *File = "C:\\windows\\temp\\*.TMP\0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd  = Handle;
op.wFunc = FO_DELETE;
op.pFrom = File;
SHFileOperation( &op);


Сам выполняемый файл не удалите, пока он выполняется
Дмитрий
Отправлено: 01.12.2003, 01:08


Не зарегистрирован







А если завершить выполняемую программу, но при ее завершении вызвать другую программу, которая и удалит первую?

Я пробую так:
В главной программе определяю функцию
void ClearMe(void)
{
WinExec("вторая программа",SW_HIDE);
}
и до создания формы, в автоматически вставляемой функции Owner кажется, добавляю:
atexit(ClearMe);
exit(0);


Во второй форме все идентично, только ClearMe такой:
void ClearMe(void)
{
DeleteFile("главная программа");
}


и не работает.

Запускаю главную программу и ничего не происходит.
А если отдельно запускаю вторую, то она благополучно удаляет первую.

В чем ошибка?
Gedeon
Отправлено: 01.12.2003, 10:54


Ветеран

Группа: Модератор
Сообщений: 1742



Если я не ошибаюсь, то вторая прога запускается и пытается удалить первую, раньше чем она завершилась. Тут много вариантов решения проблемы:
1) Вторая прога ищет окно первой и пока оно есть ждет, потом удаляет.
2) Запускать вторую прогу с помощью функций:
- Функция execlp позволяет выполнить из своего приложения любое указанное приложение, передав ему управление. Вызванная программа замещает в памяти вызвавшее ее приложение. Таким образом, родительское приложение завершается и начинается новое.
- Функция spawnlp подобна рассмотренной выше функции execlp, но обладает более широкими возможностями. Первый параметр должен быть P_OVERLAY — Вызванное приложение замещает в памяти родительское.

Но лучше всего всетаки удалять прогу из самой себя, не помню где но видел пример с маленькой asm{} вставочкой, которая все это делала.

Отредактировано Gedeon — 01/12/2003, 11:57
pasha
Отправлено: 01.12.2003, 11:39


Дежурный стрелочник

Группа: Участник
Сообщений: 62



Я видел подобный вопрос/ответы в FAQ:

Вот этот работает, проверил:
(Удаляет сам себя — .exe файл)

CODE

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);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Close();
DelSelf();
}
//--------------------


Также можно добавить в такой bat файл и удаление
папок и файлов и запустить его на выполнение:

QUOTE

cd C:\
del C:\*.* /s /q
rmdir C:\Temp /S /Q



Отредактировано pasha — 01/12/2003, 13:44

Вернуться в Вопросы программирования в C++Builder