我现在已经将任务管理器中的进程读出来了,怎么才能将其程序的路径也读出来(0分)

  • 主题发起人 wubo830814
  • 开始时间
W

wubo830814

Unregistered / Unconfirmed
GUEST, unregistred user!
就是获取进程的路径
 
这是一代码片段,用来显示exe全路径的,自己看着改吧,一般进程内找到的第一个模块是exe本身,然后会是dll模块
function FindModule: Boolean;
var
MShot: THandle;
HasNext: Boolean;
Me: TModuleEntry32;
MfName: String;
begin
Result := False;
MShot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
Me.dwSize := SizeOf(Me);
HasNext := Module32First(MShot, Me);
while HasNextdo
begin
MfName := Me.szExePath;
if SameText(extractfileext(MfName), '.exe') then
begin
Result := True;
listbox1.Items.Add(MfName);
Break;
end;

HasNext := Module32Next(MShot, Me);
end;
CloseHandle(MShot);
end;
 
我是想通过进程名称,把相应的路径显示出来
 
{------------------------------------------------------------------------------+
| 通过进程ID找到进程路径
+------------------------------------------------------------------------------}
function GetProcessPath(ProcessID: DWORD): String;
var
Handle: THandle;
fileName:string;
iLen:integer;
hMod:HMODULE;
cbNeeded: DWORD;
begin
Result := '系统进程';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, true, ProcessID);
if Handle > 0 then
begin
if EnumProcessModules(Handle, @hMod, sizeof(hMod), cbNeeded) then
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(Handle, hMod, PCHAR(fileName), MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
Result := fileName;
end;
end;
CloseHandle(Handle);
end;
end;
 
1、可以用系统快照,过去我回答过网友的此类问题。2 楼兄弟的程序不能正确运行在 NT 系统上,4 楼的兄弟等于什么都没说。
2、程序如下:
uses TLHelp32;
//ProcessName: 程序或进程名(要带'.exe');返回值: 程序完整路径。
function ProcessPath(const ProcessName: string): string;
var
hsp, hsm: LongWord;
lppe: TProcessEntry32;
lpme: TModuleEntry32;
ok: Boolean;
begin
hsp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize := SizeOf(TProcessEntry32);
lpme.dwSize := SizeOf(TModuleEntry32);
ok := Process32First(hsp, lppe);
while okdo
begin
hsm := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, lppe.th32ProcessID);
ok := Module32First(hsm, lpme);
while okdo
begin
if ExtractFileName(lpme.szExePath) <> ProcessName then
ok := Module32Next(hsm, lpme)
else
begin
Result := lpme.szExePath;
Break;
end;
end;
CloseHandle(hsm);
if not ok then
ok := Process32Next(hsp, lppe)
else
Break;
end;
CloseHandle(hsp);
end;
3、用的时候记得把'.exe'也加上,例如 ProcessPath('delphi32.exe')。如果不加'*.exe',就把 if ExtractFileName(lpme.szExePath) <> ProcessName then
这句改成 if ExtractFileName(lpme.szExePath) <> ProcessName + '.exe' then
,反正都是一回事,多了不说了。
 
多谢各位兄弟,我最后用枚举获得了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
927
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部