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
tryAssignFile(arq,'..\mestre.bat');// Cria um arquivo .bat com o nome mestre.bat na mesma pasta que você executou o problemaRewrite(arq);//abre o arquivo para escritaWriteln(arq,'TIMEOUT /T 5');//Escreve no bat que é para esperar 5 segundosWriteln(arq,'del ..\teste.exe');// Escreve no bat que é para excluir o EXEClosefile(arq);//fecha o handle de arquivo
except
end;ifCont=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;
Auto-exclusão
em Delphi, Kylix
Postado
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.