Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2009, 02:55   #1
PSix1_73
Пользователь
 
Регистрация: 12.05.2009
Сообщений: 30
Сообщение Само удаление

Подскажите как зделать так что-бы программа удаляла сама себя, допустим по времени или после очередного запуска и т.д.?
PSix1_73 вне форума Ответить с цитированием
Старый 04.08.2009, 03:22   #2
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Ну допустим так :

Код:
function DeleteApp: boolean;
var
   F: Text;
   Temp, AppName: string;
begin
      Temp:= 'delete.bat';
      AppName:= ExtractFileName(ParamSTR(0));
      AssignFile(F, Temp);
      Rewrite(F);
      Writeln(F, 'del '+ AppName);
      Writeln(F, 'del ', Temp);
      WinExec(PCHar(Temp),SW_HIDE);
      CloseFile(F);
      Halt;
end;

Последний раз редактировалось uberchel; 04.08.2009 в 03:28.
uberchel вне форума Ответить с цитированием
Старый 04.08.2009, 04:44   #3
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

по мне так проще воспользоваться tstrings меньше писанины
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 04.08.2009, 07:56   #4
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

К сожалению, автор вопроса не указал о какой системе идет речь. Код приведенный uberchel будет работать в консольных приложениях, а в приложениях GUI работать не будет, т.к. винда не даст удалить файл, выполняемого процесса. В этом случае надо сделать слегка хитрее.
Ниже код найденный в DelphiWord и который работает для виндовых приложений (проверено):
Код:
procedure DeleteSelf;
var
  BatchFile: TextFile;
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';

  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile, ':try');
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,
  'if exist "' + ParamStr(0) + '"' + ' goto try');
  Writeln(BatchFile, 'del "' + BatchFileName + '"');
  CloseFile(BatchFile);

  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;

  if CreateProcess(nil, PChar(BatchFileName), nil, nil, False,
                   IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo)
  then begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;
К тому же, вопрос был не только про способ удаления, но и про условие удаления.
Количество запусков или время, прошедшее с начала первого запуска можно в простейшем случае записывать в реестр При достижении счетчиком определенного значения запускается приведенная функция. "Защита", откровенно, сомнительного качества, но вполне сгодится для не шибко продвинутых "пиратов".

Последний раз редактировалось Karabash; 04.08.2009 в 07:58.
Karabash вне форума Ответить с цитированием
Старый 06.08.2009, 02:54   #5
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от Karabash Посмотреть сообщение
К сожалению, автор вопроса не указал о какой системе идет речь. Код приведенный uberchel будет работать в консольных приложениях, а в приложениях GUI работать не будет, т.к. винда не даст удалить файл, выполняемого процесса. В этом случае надо сделать слегка хитрее.
Ниже код найденный в DelphiWord и который работает для виндовых приложений (проверено)К тому же, вопрос был не только про способ удаления, но и про условие удаления.
Количество запусков или время, прошедшее с начала первого запуска можно в простейшем случае записывать в реестр При достижении счетчиком определенного значения запускается приведенная функция. "Защита", откровенно, сомнительного качества, но вполне сгодится для не шибко продвинутых "пиратов".
Не соглашусь !
Мой код удаляет , как GUI так и консольные и все Win32 PE.

Кстати вот исправил, там не прально написал чуть )
Код:
function DeleteApp: boolean;
var
   F: Text;
   Temp, AppName: string;
begin
      Temp:= 'delete.bat';
      AppName:= ExtractFileName(ParamSTR(0));
      AssignFile(F, Temp);
      Rewrite(F);
      Writeln(F, 'del ' + AppName);
      Writeln(F, 'del ' + Temp);
      CloseFile(F);
      WinExec(PCHar(Temp),SW_HIDE);
      Halt;
end;
Вот пример: 1 мой. 2 ваш. И где разница ???
Вложения
Тип файла: rar Project1.rar (149.1 Кб, 27 просмотров)
Тип файла: rar Project1_2.rar (149.2 Кб, 24 просмотров)
uberchel вне форума Ответить с цитированием
Старый 06.08.2009, 10:44   #6
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Цитата:
Мой код удаляет , как GUI так и консольные и все Win32 PE.
Факты говорят сами за себя:
Ваш код проверял и в первый раз и сейчас. В моей системе самоудаления exe'шника не происходит, а "мой" код его удаляет. Видимо, много зависит от ОС и как она настроена. Впрочем, не силен в этом.
Но, согласитесь, если хотя бы в одном случае из 100 ваш код не срабатывает, то это уже настораживающий факт и стоит ли его в критических ситуациях применять. Ну, вы не расстраивайтесь, я то ваш код проверил всего пару раз и вполне может быть, что причина не удаления пустяковая и никак не зависит от кода. Я бы и дальше потестил, но само по себе самоудаление меня никогда не интересовало и не интересует.
Karabash вне форума Ответить с цитированием
Старый 07.08.2009, 02:54   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Хрен ваш код что удалит, если в пути кириллица будет

http://programmersforum.ru/showpost....5&postcount=11
(исправить move на del и GetTempPath на Paramstr(0))
пыщь
JTG вне форума Ответить с цитированием
Старый 15.08.2009, 01:56   #8
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Сообщение

Вот где-то тут на форуме когда-то нашел:
Код:
//Функция для самоудаления
function SelfDelete: boolean;
var ppri: DWORD; tpri: Integer; sei: SHELLEXECUTEINFO;
  szModule, szComspec, szParams: array[0..MAX_PATH - 1] of char;
begin
  Result := false;
  if ((GetModuleFileName(0, szModule, MAX_PATH) <> 0) and
    (GetShortPathName(szModule, szModule, MAX_PATH) <> 0) and
    (GetEnvironmentVariable('COMSPEC', szComspec, MAX_PATH) <> 0)) then
  begin
    lstrcpy(szParams, '/c del ');
    lstrcat(szParams, szModule);
    lstrcat(szParams, ' > nul');

    sei.cbSize := sizeof(sei);
    sei.Wnd := 0;
    sei.lpVerb := 'Open';
    sei.lpFile := szComspec;
    sei.lpParameters := szParams;
    sei.lpDirectory := nil;
    sei.nShow := SW_HIDE;
    sei.fMask := SEE_MASK_NOCLOSEPROCESS;

    ppri := GetPriorityClass(GetCurrentProcess);
    tpri := GetThreadPriority(GetCurrentThread);

    SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
    try
      if ShellExecuteEx(@sei) then
      begin
        SetPriorityClass(sei.hProcess, IDLE_PRIORITY_CLASS);
        SetProcessPriorityBoost(sei.hProcess, TRUE);

        SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, @szModule, nil);

        result := true;
      end;
    finally
      SetPriorityClass(GetCurrentProcess, ppri);
      SetThreadPriority(GetCurrentThread, tpri)
    end
  end
end;

// пример использования
procedure TForm1.sButton1Click(Sender: TObject);
begin
if not SelfDelete then else halt;
end;
Проверял... у меня пашет отлично! попробуйте может то что нужно...
SalasAndriy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление RX artemavd БД в Delphi 1 14.06.2009 19:24
Удаление из файла M1ham Общие вопросы C/C++ 1 31.05.2009 02:45
Удаление из файла Шурик Общие вопросы Delphi 4 30.05.2009 23:08
Удаление антивируски? AltynAi Софт 7 21.11.2008 09:11