Listando processos (ok) e extrair seu path (como extrair?)

Delphi

16/06/2006

Estou fazendo um ´mini´ gerenciador de processos personalizado, a idéia é de que ele controle todos os processos que estão rodando no pc. E eu gostaria de ter uma opção para ´levantar´ um processo e para isso seria necessário saber seu patch (caminho).

Eu utilizo esse código para listar os processos em um listbox:

procedure ListaProcesso(List: TStrings);
var
  ProcEntry: TProcessEntry32;
  Hnd: THandle;
  Fnd: Boolean;
begin
  List.Clear;
  Hnd := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Hnd <> -1 then
  begin
    ProcEntry.dwSize := SizeOf(TProcessEntry32);
    Fnd := Process32First(Hnd, ProcEntry);
    while Fnd do
    begin
      List.Add(ProcEntry.szExeFile);
      Fnd := Process32Next(Hnd, ProcEntry);
    end;
    CloseHandle(Hnd);
  end;
end;


E estou usando esse na opção de finalizar o processo (achei na internet...), acredito que nesse código ele já identifique o path, pois pra finalizá-lo ele deve utilizar o caminho do arquivo...

function TerminateProcesso(sFile: string): Bool;
var
  verSystem: TOSVersionInfo;
  hdlSnap,hdlProcess: THandle;
  bPath,bLoop: Bool;
  peEntry: TProcessEntry32;
  arrPid: array [0..1023] of DWord;
  iC: DWord;
  k,iCount: Integer;
  arrModul: array [0..299] of Char;
  hdlModul: HMODULE;
begin
  result:=false;
  if ExtractFileName(sFile)=sFile then
    bPath:=false
  else
    bPath:=true;
  verSystem.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  GetVersionEx(verSystem);
  if verSystem.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then
  begin
    hdlSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    peEntry.dwSize:=Sizeof(peEntry);
    bLoop:=Process32First(hdlSnap,peEntry);
    while integer(bLoop)<>0 do
    begin
      if bPath then
      begin
        if CompareText(peEntry.szExeFile,sFile)=0 then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID) ,0);
          result:=true;
        end;
      end
      else
      begin
        if CompareText(ExtractFileName(peEntry.szExeFile),sFile)=0 then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID) ,0);
          result:=true;
        end;
      end;
      bLoop:=Process32Next(hdlSnap,peEntry);
    end;
    CloseHandle(hdlSnap);
  end
  else
    if verSystem.dwPlatformId=VER_PLATFORM_WIN32_NT then
    begin
      EnumProcesses(@arrPid,SizeOf(arrPid),iC);
      iCount:=iC div SizeOf(DWORD);
      for k:=0 to Pred(iCount) do
      begin
        hdlProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,arrPid [k]);
        if (hdlProcess<>0) then
        begin
          EnumProcessModules(hdlProcess,@hdlModul,SizeOf(hdlModul),iC);
          GetModuleFilenameEx(hdlProcess,hdlModul,arrModul,SizeOf(arrModul));
          if bPath then
          begin
            if CompareText(arrModul,sFile)=0 then
            begin
              TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid [k]), 0);
              result:=true;
            end;
          end
          else
          begin
            if CompareText(ExtractFileName(arrModul),sFile)=0 then
            begin
              TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid [k]), 0);
              result:=true;
            end;
          end;
          CloseHandle(hdlProcess);
        end;
      end;
    end;
end;


To no aguardo... ^^


Madcat

Madcat

Curtidas 0

Respostas

Madcat

Madcat

16/06/2006

Não tem como editar msg aki no fórum?! ...

Só uma obs. eu estava tentando pegar o path(caminho) processo usando uma procedure de busca em todo o pc, só que podem ocorrer vários problemas desse jeito, como demora pra varrer tudo ´n´ (n° de processos) vezes, pode haver processos com o msm nome, porém aplicativos diferentes, dentre outros, ou seja, discartada a possibilidade de c usar uma procedure de busca no PC... vlw... té mais...


GOSTEI 0
Rodc

Rodc

16/06/2006

Eu tinha um código que fazia isto, mas não tenho mais... mas já aviso que é possível sim.
Dá uma procurada pelo código aqui no forum e na net, talvêz você ache.


GOSTEI 0
Madcat

Madcat

16/06/2006

Já procurei muito e não achei, até postei em outro fórum tb muto conhecido e me falaram pra fazer a busca pelo HD... e mencionaram um tal de CreateProcess, mas não disseram como funciona isso... vou ver c acho algo sobre o createprocess, mas to aguardo aki hein :P quem puder me ajudar eu agradeço! flw... té mais


GOSTEI 0
Madcat

Madcat

16/06/2006

To passando aki só pra avisar aos amigos que ainda não consegui achar o código que necessito T_T, to no aguardo de sugestões... vlw té mais...


GOSTEI 0
POSTAR