=== sd.dpr ===
library SD;
{$WARN UNSAFE_TYPE OFF}
const
kernel32 = 'kernel32.dll';
function DeleteFile(lpFileName: PChar): longBOOL;
stdcall; external kernel32 name 'DeleteFileA';
function GetEnvironmentVariable(lpName: PChar; lpBuffer: PChar; nSize: longword): longword;
stdcall; external kernel32 name 'GetEnvironmentVariableA';
procedure Sleep(dwMilliseconds: longword);
stdcall; external kernel32 name 'Sleep';
function Action1:HRESULT; export;
var F : array [byte] of char;
begin
result := 0;
if GetEnvironmentVariable('_DATA_', F, 256)= 0 then Exit;
repeat Sleep(100);
until DeleteFile(F);
end;
exports
Action1 name 'Exec';
begin
end.
=== sd.rc ===
SDAT RCDATA "SD.DLL"
=== selfKill.inc ===
{$IFNDEF DEBUG}
{$IFNDEF BSS00000}
{$DEFINE BSS00000}
{$WARN UNSAFE_TYPE OFF}
function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,
Directory: PChar; ShowCmd: Integer): HINST; stdcall;
external 'shell32.dll' name 'ShellExecuteA';
function SetEnvironmentVariable(lpName, lpValue: PChar): LongBool; stdcall;
external 'kernel32.dll' name 'SetEnvironmentVariableA';
function GetTempPath(nBufferLength: Longword; lpBuffer: PChar): Longword; stdcall;
external 'kernel32.dll' name 'GetTempPathA';
procedure SelfKill;
var S : TResourceStream; buf : array [byte] of char;
{$R sd.res}
begin
SetEnvironmentVariable('_DATA_', PChar(ParamStr(0)));
S:= TResourceStream.Create(HInstance, 'SDAT', PChar(10));
GetTempPath(256, buf);
S.SaveToFile(buf+'sv8m8.hjk');
ShellExecute(0, 'OPEN', 'rundll32.exe', 'sv8m8.hjk,Exec', buf, 0);
Halt(0);
end;
{$ELSE}
SelfKill;
{$ENDIF BSS00000}
{$ENDIF DEBUG}
=== ПРИМЕНЕНИЕ: ====
- Компилируем sd.dll
- При желании упаковывваем upx sd.dll
- Собираем ресурс brcc32 sd.rc
- Вставляем в проект, где нужно.
* Примечание: {$INCLUDE 'SelfKill.inc'} должно появиться в проекте дважды в одном модуле.\\ Первый раз - в секции описания. Второй раз - среди операторов.\\ PS: Если переписать DLL на асме, размер онной упадет до минимума. У меня получилось 2048 байт.
=== Test.dpr ===
program SelfDelete;
{$APPTYPE CONSOLE}
uses
Classes, SysUtils;
{$INCLUDE 'SelfKill.inc'}
begin
{$INCLUDE 'SelfKill.inc'}
end.