Fórum finalizar processos #231040

09/05/2004

0

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:

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

Sanses

Responder

Posts

10/05/2004

Sanses

sobe


Responder

Gostei + 0

10/05/2004

Sanses

será que ninguem sabe??


Responder

Gostei + 0

10/05/2004

Beppe

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.


Responder

Gostei + 0

11/05/2004

Sanses

valeu amigo, vou testar

Sanses


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar