这个函数可用来枚举系统进程,先来看定义:
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(); }