2009-07-29 98 views
4

我有一個VC++控制檯應用程序,我需要檢查是否有另一個進程正在運行。我沒有窗口標題,我擁有的只是可執行文件的名稱。我如何獲得流程句柄/ PID?我可以列舉使用這個.exe運行的進程嗎?如何查看另一個進程是否在Windows上運行?

+0

這個問題是針對VB的,但是API調用也應該適用於C++:http://stackoverflow.com/questions/1143301/how-to-enumerate-processes-from-vb-6-on-win- 2003 – bdonlan 2009-07-29 18:06:14

回答

4

使用CreateToolhelp32Snapshot功能

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

其次Process32FirstProcess32Next

你會得到一個PROCESSENTRY32結構如下szExeFile成員。

PROCESSENTRY32W processInfo; 
processInfo.szExeFile 

確保枚舉之前先獲取特權SeDebugPrivilege,這樣你會得到所有會話和用戶的所有進程。

爲了獲得特權,所以你得到的所有會話:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege 

凡acquirePrivilegeByName被定義爲:

BOOL acquirePrivilegeByName(
          const TCHAR  *szPrivilegeName) 
{ 
    HANDLE   htoken; 
    TOKEN_PRIVILEGES tkp; 
    DWORD   dwerr; 

    //---------------- adjust process token privileges to grant privilege 
    if (szPrivilegeName == NULL) 
    { 
     SetLastError(ERROR_INVALID_PARAMETER); 
     return FALSE; 
    } 

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid))) 
     return FALSE; 

    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken)) 
     return FALSE; 

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) || 
     GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED 
    { 
     dwerr = GetLastError(); 
     CloseHandle(htoken); 
     SetLastError(dwerr); 
     return FALSE; 
    } 

    CloseHandle(htoken); 
    SetLastError(ERROR_SUCCESS); 

    return TRUE; 
} //acquirePrivilegeByName() 

如果您需要完整的過程圖像名稱可以使用QueryFullProcessImageName,但szExeFile會員可能已經足夠滿足您的需求。

+0

完美。使用源代碼。謝謝! – 2009-07-29 23:16:24

相關問題