dolphin
|
Дата: Суббота, 21.02.2009, 23:22 | Сообщение # 1
|
Администратор
Сообщений: 902
Статус: Offline
|
Первый способ:
Code
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;
А вот тот же способ, но немного модифицированный:
Code
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.
Второй способ:
Code
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;
Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
|
|
|
|
dolphin
|
Дата: Среда, 06.05.2009, 11:09 | Сообщение # 2
|
Администратор
Сообщений: 902
Статус: Offline
|
Усовершенствованный способ, удаляет даже из русских папок
Доступно только для пользователей
Сообщение отредактировал dolphin - Понедельник, 16.04.2012, 12:13
|
|
|
|
freez
|
Дата: Суббота, 09.01.2010, 04:13 | Сообщение # 3
|
Частый гость
Зарегистрирован: 09.01.2010
Группа: Пользователи
Сообщений: 30
Статус: Offline
|
эти способы будут работать на NT системах ?  |
|
|
|
dolphin
|
Дата: Суббота, 09.01.2010, 15:40 | Сообщение # 4
|
Администратор
Сообщений: 902
Статус: Offline
|
Будут работать везде
Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
|
|
|
|
opius
|
Дата: Пятница, 02.04.2010, 11:34 | Сообщение # 5
|
Частый гость
Зарегистрирован: 18.03.2010
Группа: Пользователи
Сообщений: 46
Статус: Offline
|
Вот так еще можно
Доступно только для пользователей
Сообщение отредактировал dolphin - Понедельник, 16.04.2012, 12:08
|
|
|
|