由进程名取得进程ID

1.此处进程名是指进程可执行文件的名称(任务管理器进程列表中显示的映像名称);

2.windows下没有线程的API,实现思路采用CreateToolhelp32Snapshot函数创建进程快照然后依次比较;

3.使用CreateToolhelp32Snapshot函数需要包含头文件#include<tlhelp32.h>

4.具体原理讲解:

HANDLE WINAPI CreateToolhelp32Snapshot(
  _In_ DWORD dwFlags,       //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
  _In_ DWORD th32ProcessID  //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或                   获取当前进程快照时可以设为0
);

1.dwFlags,标志位,可取如下值:
TH32CS_INHERIT        ——表示快照句柄是可继承的
TH32CS_SNAPALL        ——包括系统中的所有进程和线程,以及th32ProcessID中指定的进程的堆和模块 
TH32CS_SNAPHEAPLIST   ——包括快照中th32ProcessID中指定的进程的所有堆(参阅:Heap32ListFirst)
TH32CS_SNAPMODULE     ——包括快照中th32ProcessID中指定的进程的所有模块
TH32CS_SNAPMODULE32   ——包括从64位进程调用时快照中的th32ProcessID中指定的进程的所有32位模块
TH32CS_SNAPPROCESS    ——包括快照中系统中的所有进程,要枚举进程,请参阅Process32First
TH32CS_SNAPTHREAD     ——包括快照中系统中的所有线程,要枚举线程,请参阅Thread32First

2.th32ProcessID,一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0。
当指定TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32或TH32CS_SNAPALL值时,使用此参数。否则,它将被忽略,并且所有进程都包括在快照中。

3.返回值
如果函数成功,它将返回一个打开的句柄到指定的快照。 
如果函数失败,则返回INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。可能的错误代码包括ERROR_BAD_LENGTH。                

这里我们要获取系统中所有进程,所以dwFlags参数传入TH32CS_SNAPPROCESS,th32ProcessID传入NULL,创建系统快照。  

5.具体实现代码

PROCESSENTRY32结构如下:     
typedef struct tagPROCESSENTRY32{     
  DWORD   dwSize;              //结构大小;     
  DWORD   cntUsage;            //此进程的引用计数;     
  DWORD   th32ProcessID;       //进程ID;     
  DWORD   th32DefaultHeapID;   //进程默认堆ID;     
  DWORD   th32ModuleID;        //进程模块ID;     
  DWORD   cntThreads;          //此进程开启的线程计数;     
  DWORD   th32ParentProcessID; //父进程ID;     
  LONG   pcPriClassBase;       //线程优先权;     
  DWORD   dwFlags;             //保留;     
  char   szExeFile[MAX_PATH];  //进程全名;     
  }PROCESSENTRY32;

DWORD GetProcessIdByName(TCHAR *pProcess)
{

   DWORD ProcessId = NULL;
   PROCESSENTRY32 lppe;//PROCESSENTRY32结构体如参考上面所示
   //在使用这个结构前,先设置它的大小
   lppe.dwSize = sizeof(lppe);
   //给系统内所有的进程拍个快照
   HANDLE hProcessSnap =    ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
   if(hProcessSnap == INVALID_VALUE_GANDLE)
   {
     printf("CreateToolhelp32Snapshot调用失败。\n");
     return NULL;
   }
   //遍历进程快照,轮流显示每个进程的信息
   BOOL bMore = ::Process32First(hProcessSnap, &lppe);
   while(bMore)
   {
     if(strcmp(lppe.szExeFile, pProcess) == 0)
     {
       ProcessId = lppe.th32ProcessID;
     }
     bMore = ::Process32Next(hProcessSnap, &lppe);
   }
   //清理hProcessSnap对象
   ::CloseHandle(hProcessSnap);
   //返回匹配的进程id,如果没有匹配则返回NULL
   return ProcessId;
}

猜你喜欢

转载自blog.csdn.net/paradox_1_0/article/details/82527269
今日推荐