从主进程获取句柄

时间:2012-04-17 19:51:50

标签: multithreading delphi process

  

可能重复:
  Determine the parent process of the current app

我想获得一个进程的MainProcess句柄或PID。 例如,Google Chrome会为每个标签删除另一个实际上是线程的进程。 在ProcessExplorer中,它将树视图中的chrome.exe显示为主进程,并在其下方显示线程。我如何检查或获取MainProcess Handle / PID?像WindowsAPI的东西?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

@RRUZ已经在Stack Overflow上回答了almost identical question。但是,那里的代码不正确,因为它将进程ID声明为THandle。以下更正了我发现的错误,并调整例程以返回PID而不是文件名:

uses
  Windows,
  tlhelp32,
  SysUtils;

function GetParentPid: DWORD;
var
  HandleSnapShot: THandle;
  EntryParentProc: TProcessEntry32;
  CurrentProcessId: DWORD;
  HandleParentProc: THandle;
  ParentProcessId: DWORD;
begin
  Result := 0;
  HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   //enumerate the process
  if HandleSnapShot<>INVALID_HANDLE_VALUE then
  begin
    EntryParentProc.dwSize := SizeOf(EntryParentProc);
    if Process32First(HandleSnapShot, EntryParentProc) then    //find the first process
    begin
      CurrentProcessId := GetCurrentProcessId; //get the id of the current process
      repeat
        if EntryParentProc.th32ProcessID=CurrentProcessId then
        begin
          ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process
          HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId);
          if HandleParentProc<>0 then
          begin
            Result := ParentProcessId;
            CloseHandle(HandleParentProc);
          end;
          break;
        end;
      until not Process32Next(HandleSnapShot, EntryParentProc);
    end;
    CloseHandle(HandleSnapShot);
  end;
end;

我知道这是一个重复的问题,但这里的代码正是OP想要的,所以我至少会让它显示一段时间。