Delphi获取EXE的句柄

时间:2011-01-30 13:33:46

标签: delphi

这是我现在正在做的一个例子:

var
Client : String;
Handle : Integer;
begin
Client := 'Window Name';
GetWindowThreadProcessId(FindWindow(nil, PAnsiChar(Client)), @ProcessId);
Handle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
end;

我宁愿用它的exe名称抓取Process的句柄...... 这有可能吗?

3 个答案:

答案 0 :(得分:4)

Application.Handle
看起来你正试图通过WinAPI在Delphi中编程。在绝大多数不需要它的情况下,VCL提供了适当的面向对象的包装器 可能你会在这个组件包中找到一些东西:GLibWMI

答案 1 :(得分:1)

您可以使用ProcessInfo

var
  ProcessInfo : TProcessInfo;
  Process : TProcessItem;
  PID: Cardinal;
  ProcessHandle : THandle;
begin
  ProcessInfo := TProcessInfo.Create(nil);
  try
    Process := ProcessInfo.RunningProcesses.FindByName('Notepad.exe');
    if Assigned(Process) then
    begin
      PID := Process.ProcessID;
      ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
      if ProcessHandle > 0 then
      try
        {Add your code here}
      finally
        CloseHandle(ProcessHandle);
      end;
  end;
  finally
    ProcessInfo.Free;
  end;
end;

如果您不喜欢使用第三方组件,可以学习ProcessInfo的源代码,以了解它如何检索正在运行的进程列表及其属性。基本上它会在Windows Tool Help API上传递其大部分功能。

答案 2 :(得分:0)

由于vcldeveloper提供的链接已损坏,因此这里没有第三方组件的完整功能代码。

首先我们将找到进程ID(PID),然后我们通过打开所有访问来获得进程句柄(因为注释中提到的OP将需要这个用于ReadProcessMemory功能)。

如果PID的函数返回0,则表示该进程很可能没有运行(或者在运行的进程列表中找不到)

function GetPIDbyProcessName(processName:String):integer;
var 
  GotProcess: Boolean; 
  tempHandle: tHandle; 
  procE: tProcessEntry32;
begin
  tempHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); 
  procE.dwSize:=SizeOf(procE); 
  GotProcess:=Process32First(tempHandle, procE);
  {$B-} 
    if GotProcess and (procE.szExeFile <> processName) then 
      repeat GotProcess := Process32Next(tempHandle, procE); 
      until (not GotProcess) or (procE.szExeFile = processName); 
  {$B+}

  if GotProcess then 
    result := procE.th32ProcessID 
  else
    result := 0; // process not found in running process list

  CloseHandle(tempHandle);
end;

接下来,我们将从我们获得的PID中获取/打开Process句柄。整个代码/用法如下:

var myPID, myProcessHandle: integer;
begin
  myPID:=GetPIDbyProcessName('someExeName.exe');
  myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID);
end;

您应该以{{1​​}}作为第一个参数访问myProcessHandle的方式存储ReadProcessMemory(myProcessHandle...)

另外,将这些添加到您的全局使用条款中:
Winapi.Windows(对于ReadProcessMemory和OpenProcess)
Winapi.tlHelp32(用于获取PID tProcessEntry32变量)