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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2009, 10:19   #1
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию Как программе удалить саму себя?

Здраствуйте, моя задача программно удалить себя, в поисковике нашёл несколько примеров
Код:
uses  
   Windows, SysUtils;  

procedure DeleteMe;  
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;
Код:
program delete2;  

uses  
   SysUtils,  
   windows;  

var  
    BatchFile: TextFile;  
    BatchFileName : string;  
    TM : Cardinal;  
    TempMem : PChar;  

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

    TM:=70;  
    GetMem (TempMem,TM);  
    GetShortPathName (pchar(BatchFileName), TempMem, TM);  
    BatchFileName:=TempMem;  
    FreeMem(TempMem);  

    winexec(Pchar(BatchFileName),sw_hide);  

    halt;  

end.
Код:
procedure DeleteSelf;  
var  
   module: HModule;  
   buf: array[0..MAX_PATH - 1] of char;  
   p: ULong;  
   hKrnl32: HModule;  
   pExitProcess,  
   pDeleteFile,  
   pFreeLibrary: pointer;  
begin  
   module := GetModuleHandle(nil);  
   GetModuleFileName(module, buf, SizeOf(buf));  
   CloseHandle(THandle(4));  
   p := ULONG(module) + 1;  
   hKrnl32 := GetModuleHandle('kernel32');  
   pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');  
   pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');  
   pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');  
   asm  
     lea eax, buf  
     push 0  
     push 0  
     push eax  
     push pExitProcess  
     push p  
     push pDeleteFile  
     push pFreeLibrary  
     ret  
   end;  
end;
проблема в том, что ни один код не работает...
помогите довести до ума, спс!
dolphin705 вне форума Ответить с цитированием
Старый 03.05.2009, 11:03   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Твой пример кода №2 работает прекрасно. НО !!! В пути в проге (названия каталогов) и имя самой проги не должны содержать русские буквы.

P.S. Да и чуть не забыл : измени строку
Код:
winexec(Pchar(BatchFileName),sw_hide);
на
Код:
winexec(Pchar('cmd.exe /c ' + BatchFileName),sw_hide);
Хотя может и в исходном виде все заработает ... Можно попробовать ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT

Последний раз редактировалось Kotofff; 03.05.2009 в 11:07.
Kotofff вне форума Ответить с цитированием
Старый 03.05.2009, 11:14   #3
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Спасибо, проблема была в каталогах в которых лежит программа

А если директория с русскими символами, как удилится?

Последний раз редактировалось KORN; 03.05.2009 в 11:57. Причина: пользуемся правкой
dolphin705 вне форума Ответить с цитированием
Старый 03.05.2009, 16:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А если директория с русскими символами, как удалиться?
попробуй заменить код создания батника на такой:
Код:
{функция преобразования строки в OEM (DOS) кодировку}
function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;
....
    Writeln(BatchFile,'del "' + StrAnsiToOem(ParamStr(0)) + '"');  
    Writeln(BatchFile,'if exist "' + StrAnsiToOem(ParamStr(0)) + '" goto try');  
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.05.2009, 23:16   #5
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Перекодировка работает, программа удаляется, но батник остаётся
dolphin705 вне форума Ответить с цитированием
Старый 03.05.2009, 23:22   #6
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Здесь всё работает
Код:
program Del_self;

uses
  SysUtils,
  windows;

var
    BatchFile: TextFile;  
    BatchFileName : string;  
    TM : Cardinal;  
    TempMem : PChar;  

function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  SetLength(Result, Length(S));
  AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;

begin  
    BatchFileName:=ExtractFilePath(ParamStr(0))+ '$$336699.bat';

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

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

    TM:=70;  
    GetMem (TempMem,TM);  
    GetShortPathName (pchar(BatchFileName), TempMem, TM);  
    BatchFileName:=TempMem;  
    FreeMem(TempMem);  
    winexec(Pchar('cmd.exe /c ' + BatchFileName),sw_hide);
    //winexec(Pchar(BatchFileName),sw_hide);  

    halt;  

end.
dolphin705 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Может ли скрипт удалить сам себя bashkos PHP 4 03.08.2008 19:57
Программа печатающая саму себя :o K@$K@ Паскаль, Turbo Pascal, PascalABC.NET 7 09.04.2008 16:24
Прога может удалить сама себя?? UnD)eaD)Snake Софт 5 18.08.2007 00:46
Как распечатать саму программу? Борзов Паскаль, Turbo Pascal, PascalABC.NET 28 09.01.2007 16:52
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36