Window API 第五篇 WTSEnumerateProcesses

这个函数可用来枚举系统进程,先来看定义:

BOOL WTSEnumerateProcesses(
  _In_  HANDLE            hServer,
  _In_  DWORD             Reserved,
  _In_  DWORD             Version,
  _Out_ PWTS_PROCESS_INFO *ppProcessInfo,
  _Out_ DWORD             *pCount
);
参数说明:
hServer: 终端服务器的句柄,可以是调用WTSOpenServer()的返回值,或者用宏WTS_CURRENT_SERVER_HANDLE 来指定你的程序正在运行的终端服务器。到时候此参数可以为NULL,或者WTS_CURRENT_SERVER_HANDLE或者在控制台下输入nbtstat -n命令查看本地NetBIOS名称,
进一步调用WTSOpenServer(LPTSTR pServerName)函数,即可得到hServer的句柄。
这里有几个宏需要注意:
#define WTS_CURRENT_SERVER ((HANDLE)NULL)
#define WTS_CURRENT_SERVER_HANDLE ((HANDLE)NULL)
#define WTS_CURRENT_SERVER_NAME (NULL)
Reserved:保留参数,必须为0
Version:指定枚举请求的版本,必须为1
ppProcessInfo:输出参数,指向PWTS_PROCESS_INFO结构的指针, WTS_PROCESS_INFO 结构里存有进程的信息,包括name和ID
pCount:输出参数,返回枚举到的个数,即PWTS_PROCESS_INFO的数量。

返回值:成功返回非零,失败返回0。
说明:需要引入头文件:#include <WtsApi32.h> 还要导入静态库 #pragma comment (lib, "Wtsapi32.lib")
需要注意,如果调用了WTSOpenServer()函数,最后要调用WTSCloseServer()函数释放资源。但不论何时都别忘了调用WTSFreeMemory()函数释放PWTS_PROCESS_INFO指针资源。
下面举一个简单的例子


void main()
{
     PWTS_PROCESS_INFO ppi;
     DWORD dwCounts; 
     BOOL bRet = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppi, &dwCounts);
     if (!bRet)
         return ;
//这里先把ppi存起来,方便以后释放,当然如果用数组下标的形式访问的话就不用这样繁琐了
PWTS_PROCESS_INFO ppiTemp = ppi;
     for (int i = 0; i< dwCounts; i ++)
     {
        printf("%s 	 %d 
", ppi->pProcessName, ppi->ProcessId);//ppi[i].pProcessName
        ppi ++;
      }
   //内存泄漏就是从这里来的,好多人要忘记这里
   WTSFreeMemory(ppiTemp);
  getchar();
}
原文地址:https://www.cnblogs.com/priarieNew/p/9754113.html