如何根据进程id取得程序名?

解决方案 »

  1.   

    uses tlhelp32;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      pe:PROCESSENTRY32;
      me:MODULEENTRY32;
      hp,hm:Thandle;
      b,b1:boolean;
    begin
      hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
      pe.dwSize:=SizeOf(pe);
      b:=Process32First(hp,pe);
      while  b do
      begin
        hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
        me.dwSize:=sizeof(ModuleEntry32);
        if Module32First(hm,me) then
        begin
        b1:=Module32First(hm,me);
        while  b1 do
        begin
          if me.th32ModuleID=pe.th32ModuleID then
            listbox1.Items.Add(me.szExePath);
          b1:=Module32Next(hm,me);
        end;
      end;
        b:=Process32Next(hp,pe);
      end;end;
     
     --------------------------------------------------------------------------------
    toolhelp api 在 nt 上不支持
    下面的可以在 nt 上运行
    如果要copy到其他机上运行,要顺便拷贝 psapi.dll(这个dll安装delphi或者c++ builder后就有了)#include "psapi.hpp"假使process id是 pid 的话:HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);
    if( NULL != hProcess )
      {
      HMODULE hMod;
      DWORD cbNeeded;
      if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
        {
        char buf[MAX_PATH+1]="";
        if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)>0)
          // 
          // buf放的就是名字
          //
        }
      CloseHandle(hProcess);
      }
     
     --------------------------------------------------------------------------------
    找出所有进程的 process id:下面的程序也是可以在 nt 上运行:下面的程序也是需要 psapi.dll#include "psapi.hpp"DWORD pid[1000];
    DWORD ret_id=0;
    if(!EnumProcesses(pid,sizeof pid,&ret_id))
      //返回0,就是失败了成功的话返回 非 0 值ret_id是返回的字节数,注意不是id的个数,
    比如返回 1 个id,实际上ret_id等于4,(表示4个字节)
    ret_id/4 才是 返回 的id 的个数返回的id放在 数组 pid
    大小要大于 id 可能的最大数才找的全,上面的例子是可以找1000个,足够了,
    如果嫌大,200个就可以了
      

  2.   

    c++下实现起来比较容易
    GetProcessById
    能够获得进程的全部信息,包括ProcessName,MainWindowName,MainWindowHandle等
    可以去查一查msn
    不过delphi下好像没有解释这个函数