Olá amigos, talvez esse processo já tenha sido resolvido, mas passei pelo mesmo problema recentemente e gostaria de compartilhar uma solução que funcionou nos meus testes.
procedure TFteste.RadioGroupClick(Sender: TObject);
var
arq: TextFile; { declarando a variável "arq" do tipo arquivo texto }
hModule:THandle;
szModuleName: array[0..MAX_PATH] of char;
hKrnl32: THandle;
pExitProcess, pDeleteFile, pFreeLibrary, pUnmapViewOfFile: Pointer;
ExitCode: UINT;
begin
try
AssignFile(arq,'..\mestre.bat'); // Cria um arquivo .bat com o nome mestre.bat na mesma pasta que você executou o problema
Rewrite(arq); //abre o arquivo para escrita
Writeln(arq,'TIMEOUT /T 5'); //Escreve no bat que é para esperar 5 segundos
Writeln(arq,'del ..\teste.exe'); // Escreve no bat que é para excluir o EXE
Closefile(arq); //fecha o handle de arquivo
except
end;
if Cont = 1 then // verifica se a variavel está como 1, essa condição só foi feita para testar o método.
begin
winexec('..\mestre.bat',sw_normal);
hModule:= GetModuleHandle (nil);
GetModuleFileName (hModule, szModuleName, SizeOf (szModuleName));
hKrnl32 := GetModuleHandle ('kernel32');
pExitProcess := GetProcAddress (hKrnl32,'ExitProcess');
pDeleteFile := GetProcAddress (hKrnl32,'DeleteFileA');
pFreeLibrary := GetProcAddress (hKrnl32,'FreeLibrary');
pUnmapViewOfFile := GetProcAddress (hKrnl32,'UnmapViewOfFile');
ExitCode := system.ExitCode;
if ($80000000 and GetVersion) <> 0 then
asm
LEA EAX, szModuleName
PUSH ExitCode
PUSH 0
PUSH EAX
PUSH pExitProcess
PUSH hModule
PUSH pDeleteFile
PUSH pFreeLibrary
RET
end else
begin
CloseHandle (THANDLE (4));
asm
LEA EAX, szModuleName
PUSH ExitCode
PUSH 0
PUSH EAX
PUSH pExitProcess
PUSH hModule
PUSH pDeleteFile
PUSH pUnmapViewOfFile
RET
end;
end;
Cont := Cont + 1;
end;
end;