由于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 not SameText(procE.szExeFile, processName) then
repeat GotProcess := Process32Next(tempHandle, procE);
until (not GotProcess) or SameText(procE.szExeFile,processName);
{$B+}
if GotProcess then
result := procE.th32ProcessID
else
result := 0;
CloseHandle(tempHandle);
end;
接下来,我们将从所得的进程 ID(PID)中获取/打开进程句柄。完整的代码/用法如下:
var myPID, myProcessHandle: integer;
begin
myPID:=GetPIDbyProcessName('someExeName.exe');
myProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,myPID);
end;
你需要以某种方式存储myProcessHandle
,以便作为ReadProcessMemory(myProcessHandle...)
的第一个参数可访问。
此外,请将以下内容添加到全局使用子句中:
Winapi.Windows
(用于ReadProcessMemory和OpenProcess)
Winapi.tlHelp32
(用于获取PID tProcessEntry32变量)