进程管理中如何得到进程可执行文件的绝对路径?(100分)

  • 主题发起人 主题发起人 guest8899
  • 开始时间 开始时间
G

guest8899

Unregistered / Unconfirmed
GUEST, unregistred user!
最近想写一个进程管理的程序,得到进程列表比较简单,但不知道如何获得进程中文件
的绝对路径,请高人指点,谢谢
 
这个简单,下面是实现由文件名查找其进程ProcessID的函数。
参数意义:
FindAProcess(const AFilename:string; //要查找得文件名
const PathMatch:Boolean; //true则判断路径是否匹配
var ProcessID: DWORD); //返回找到的hProcessID

procedure FindAProcess(const AFilename:string; const PathMatch:Boolean; var ProcessID: DWORD);
var
lppe:TProcessEntry32;
SsHandle:Thandle;
FoundAProc, FoundOK:boolean;
begin
SsHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
lppe.dwSize:=sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle,lppe);
//枚举Process,然后判断是否是所要查找的Process
while FoundAProc do
begin
Err:=UpperCase(lppe.szExefile);
Synchronize(ShowDBMessage);
//根据PathMatch的值来决定匹配的方式
if PathMatch then
FoundOK:=UpperCase(lppe.szExefile)=(UpperCase(AFilename))
else
begin
FoundOK:=UpperCase(ExtractFilename(lppe.szExefile))=UpperCase(ExtractFilename(AFilename));
end;
if FoundOK then
begin
ProcessID:=lppe.th32ProcessID;
break;
end;
FoundAProc :=Process32Next(SsHandle,lppe);
end;
if not FoundAProc then
begin
Err:=SysErrorMessage(GetLastError);
Synchronize(ShowDBMessage);
ProcessID:=0;
end;
CloseHandle(SsHandle);
end;
 
可能有点问题,
我的意思是制如果发现notepad.exe进程,如何得到notepad.exe的路径如:d:/winnt/notepad.exe
而不是判断notepad进程是否在运行
 
但是lppe.szExefile返回的结果中不含有文件的路径信息
 
你用的是nt/2000/xp吧,9X/ME下好像没问题.
2000/xp下你可以用enumprocesses,enumprocessmodules,GetModuleFileName来获得
绝对路径.可以参考:
http://www.alexfedotov.com/articles/enumproc.asp
 
procedure TForm1.Button2Click(Sender: PObj);
var
Found: BOOL;
HSnapshot, HProcess: THandle;
Lppe: TProcessEntry32;
str:String;
begin
HSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Lppe.dwSize:=Sizeof(Lppe);
Found:=Process32First(HSnapshot,Lppe);
while Found do
begin
try
if Lppe.szExeFile=ListBox1.Items[ListBox1.CurIndex] then
// if ExtractFilename(Uppercase(Lppe.szExeFile))=ExtractFilename(Uppercase('notepad.exe')) then
begin
HProcess:=OpenProcess(PROCESS_ALL_ACCESS, FALSE, Lppe.th32ProcessID);
//终止进程
TerminateProcess(HProcess,0);
ShowMessage('Process:'+ExtractFilename(Uppercase(Lppe.szExeFile))+' Killed!');
Button1Click(Form1);
Break;
end;
except end;
Found:=Process32Next(HSnapshot,Lppe);
end;
end;
使用以上程序杀掉进程(如天网防火墙的进程pfwmain.exe)后,通过windows 2000的任务管理器
发现天网进程已经不存在,说明进程已经被killed,但此时网络中断,http、ftp、telnet等
将无法连接网络,并造成系统死锁的现象(无法正常关机)。请高手解释一下原因,并提供
kill进程的安全方法,谢谢
 
GetModalFileName
 
后退
顶部