如何根据一个进程的processID来获取该进程的可执行文件名(100分)

  • 主题发起人 主题发起人 netfan
  • 开始时间 开始时间
N

netfan

Unregistered / Unconfirmed
GUEST, unregistred user!
<br>如何根据一个进程的processID来获取该进程的可执行文件名?<br>如何列出当前系统中的所有进程及其相关的可执行程序(如EXE,DLL等)<br>谢谢!
 
uses tlhelp32;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; pe:PROCESSENTRY32;<br>&nbsp; me:MODULEENTRY32;<br>&nbsp; hp,hm:Thandle;<br>&nbsp; b,b1:boolean;<br>begin<br>&nbsp; hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);<br>&nbsp; pe.dwSize:=SizeOf(pe);<br>&nbsp; b:=Process32First(hp,pe);<br>&nbsp; while &nbsp;b do<br>&nbsp; begin<br>&nbsp; &nbsp; hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);<br>&nbsp; &nbsp; me.dwSize:=sizeof(ModuleEntry32);<br>&nbsp; &nbsp; if Module32First(hm,me) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; b1:=Module32First(hm,me);<br>&nbsp; &nbsp; while &nbsp;b1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; if me.th32ModuleID=pe.th32ModuleID then<br>&nbsp; &nbsp; &nbsp; &nbsp; listbox1.Items.Add(me.szExePath);<br>&nbsp; &nbsp; &nbsp; b1:=Module32Next(hm,me);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>&nbsp; &nbsp; b:=Process32Next(hp,pe);<br>&nbsp; end;<br><br>end;<br><br>
 
toolhelp api 在 nt 上不支持<br>下面的可以在 nt 上运行<br>如果要copy到其他机上运行,要顺便拷贝 psapi.dll(这个dll安装delphi或者c++ builder后就有了)<br><br>#include "psapi.hpp"<br><br>假使process id是 pid 的话:<br><br>HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);<br>if( NULL != hProcess )<br>&nbsp; {<br>&nbsp; HMODULE hMod;<br>&nbsp; DWORD cbNeeded;<br>&nbsp; if( EnumProcessModules( hProcess, &amp;hMod, sizeof( hMod ), &amp;cbNeeded ) )<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; char buf[MAX_PATH+1]="";<br>&nbsp; &nbsp; if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)&gt;0)<br>&nbsp; &nbsp; &nbsp; // <br>&nbsp; &nbsp; &nbsp; // buf放的就是名字<br>&nbsp; &nbsp; &nbsp; //<br>&nbsp; &nbsp; }<br>&nbsp; CloseHandle(hProcess);<br>&nbsp; }
 
找出所有进程的 process id:<br><br>下面的程序也是可以在 nt 上运行:<br><br>下面的程序也是需要 psapi.dll<br><br>#include "psapi.hpp"<br><br>DWORD pid[1000];<br>DWORD ret_id=0;<br>if(!EnumProcesses(pid,sizeof pid,&amp;ret_id))<br>&nbsp; //返回0,就是失败了<br><br>成功的话返回 非 0 值<br><br>ret_id是返回的字节数,注意不是id的个数,<br>比如返回 1 个id,实际上ret_id等于4,(表示4个字节)<br>ret_id/4 才是 返回 的id 的个数<br><br>返回的id放在 数组 pid<br>大小要大于 id 可能的最大数才找的全,上面的例子是可以找1000个,足够了,<br>如果嫌大,200个就可以了<br>
 
多人接受答案了。
 
后退
顶部