finalizar processos
Estou desenvolvendo um sistema p/ lan house e o mesmo ao final do tempo deve fechar todas as aplicações abertas. Tenho o nome.exe de todas as aplicações que podem ser usadas nesta máquina gravadas nem banco de dados. Tenho tb esta rotina que peguei aqui no clube mesmo:
Essa unit carrega uma listbox o nome.exe de todos os processos em execução. Gostaria de comparar com meu banco de dados e o que estiver cadastrado finalizar, o que não tiver continuar. Não estou conseguindo fazer essa rotina.
uses TLHelp32;
implementation
{$R *.dfm}
{ As variáveis }
var
Process_Entry_32 : TProcessEntry32;
Handle_Snap_Shot : THandle;
ProcessHandle : THandle;
{ Iniciar as variáveis }
Procedure IniciarVars();
Begin
Handle_Snap_Shot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
Process_Entry_32.dwSize := SizeOf(TProcessEntry32);
Process32First(Handle_Snap_Shot, Process_Entry_32);
End;
Procedure ListarProcessos;
var
i : integer;
Begin
i := 0;
Repeat
With Form1.ListBox1.Items do begin
Add(Format(´¬s´,[ExtractFileName(Process_Entry_32.szExeFile)]));
{Add(Format(´Path: ¬s´,[Process_Entry_32.szExeFile]));
Add(Format(´PID: ¬x´, [Process_Entry_32.TH32ProcessID]));
Add(Format(´Parent PID: ¬x´, [Process_Entry_32.TH32ParentProcessID]));
Add(Format(´Size: ¬x´, [Process_Entry_32.dwSize]));
Add(Format(´Usage: ¬d´, [Process_Entry_32.cntUsage]));
Add(Format(´Default Heap: ¬x´, [Process_Entry_32.th32DefaultHeapID]));
Add(Format(´MID: ¬x´, [Process_Entry_32.th32ModuleID]));
Add(Format(´Threads: ¬x´, [Process_Entry_32.cntThreads]));
Add(Format(´PriClassBase: ¬d´, [Process_Entry_32.pcPriClassBase]));
Add(Format(´Flags: ¬x´, [Process_Entry_32.dwFlags]));
Add(´´);
Form1.Label1.Caption:=´Há ´+ IntToStr(i) + ´ processos ativos.´;
i := i + 1; }
End;
Until (not Process32Next(Handle_Snap_Shot, Process_Entry_32));
CloseHandle(Handle_Snap_Shot);
End;
{
Terminar Processo
Obtém o HANDLE para o processo em questão através de seu ID
e termina o processo após confirmação do usuário
}
Procedure TerminarProcesso;
Begin
Repeat
If (ExtractFileName(Process_Entry_32.szExeFile) =
Form1.ListBox1.Items[Form1.ListBox1.ItemIndex]) then begin
ProcessHandle := OpenProcess(PROCESS_TERMINATE, TRUE, Process_Entry_32.TH32ProcessID);
{ If MessageDlg(
PChar(Format(´O processo ¬s, ID ¬x será terminado. Continuar ?´,
[Process_Entry_32.szExeFile, Process_Entry_32.TH32ProcessID])),
mtWarning, [MBOK, MBCANCEL], 0) = IDOK then begin }
TerminateProcess(ProcessHandle,0);
// End;
CloseHandle(ProcessHandle);
End;
Until (not Process32Next(Handle_Snap_Shot, Process_Entry_32));
CloseHandle(Handle_Snap_Shot);
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
IniciarVars();
ListarProcessos();
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IniciarVars();
TerminarProcesso();
end;
end.
Essa unit carrega uma listbox o nome.exe de todos os processos em execução. Gostaria de comparar com meu banco de dados e o que estiver cadastrado finalizar, o que não tiver continuar. Não estou conseguindo fazer essa rotina.
Sanses
Curtidas 0
Respostas
Sanses
09/05/2004
sobe
GOSTEI 0
Sanses
09/05/2004
será que ninguem sabe??
GOSTEI 0
Beppe
09/05/2004
procedure KiilProcessList(List: TStrings; Members: Boolean); // List contém a lista de caminho completo para os programas // Members indica se os processos desta lista devem ser mantidos, // ou terminados. var Th: THandle; Pe: TProcessEntry32; begin Th := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try Pe.dwSize := SizeOf(Pe); if Process32First(Th, Pe) then repeat if (List.IndexOf(Pe.szExeFile) < 0) xor Members then TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, Pe.th32ProcessID), 0); until not Process32Next(Th, Pe); finally CloseHandle(Th); end; end;
Não testei, e não incluí qq checagem de erro, mas acho q isto não será um problema. Carregue os registros no bd para uma TString que passará para a função. Passe True como segundo argumento.
GOSTEI 0
Sanses
09/05/2004
valeu amigo, vou testar
Sanses
Sanses
GOSTEI 0