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 \t %d \n", ppi->pProcessName, ppi->ProcessId);//ppi[i].pProcessName
        ppi ++;
      }
   //內存泄漏就是從這里來的,好多人要忘記這里
   WTSFreeMemory(ppiTemp);
  getchar();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM