這個函數可用來枚舉系統進程,先來看定義:
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 \t %d \n", ppi->pProcessName, ppi->ProcessId);//ppi[i].pProcessName
ppi ++;
}
//內存泄漏就是從這里來的,好多人要忘記這里
WTSFreeMemory(ppiTemp);
getchar();
}
