2010-08-17 47 views
3

我必須爲HANDLE類型的變量。 第一個變量是一個沒有PROCESS_QUERY_INFORMATION權限的進程HANDLE(名字爲hProcess)。 第二個變量是一個進程HANDLE(名稱爲hwndProcess),我通過OpenProcess函數打開並且具有PROCESS_QUERY_INFORMATION訪問權限。我確定這兩個過程都是一個過程。 但是當我比較如下返回false; if(hProcess == hwndProcess){do something} 我應該怎麼做?如何比較HANDLE類型的兩個變量

回答

3

沒有明確的方法來檢查兩個句柄是否引用相同的進程。唯一的方法是查詢過程信息並檢查,例如在每個句柄上使用GetProcessId來檢查進程ID。

如果您沒有必要的訪問權限來調用所需的查詢功能,那麼您可以嘗試調用DuplicateHandle以獲得具有更多訪問權限的新句柄。但是,如果失敗了,那麼您無法判斷句柄是否屬於同一過程。

+0

DuplicateHandle的語法如下。 BOOL WINAPI DuplicateHandle( __in HANDLE hSourceProcessHandle, __in HANDLE hSourceHandle, __in HANDLE hTargetProcessHandle, __out LPHANDLE lpTargetHandle, __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in DWORD dwOptions ); dwOptions可以獲得以下兩個值之一(DUPLICATE_CLOSE_SOURCE或DUPLICATE_SAME_ACCESS)或這些值的任意組合。現在可以將這些值與 PROCESS_QUERY_INFORMATION標記進行連接。 – Phoenix 2010-08-17 08:51:26

+0

將dwOptions設置爲0,並將dwDesiredAccess設置爲所需的訪問權限(例如PROCESS_QUERY_INFORMATION和其他任何您需要的)。 – 2010-08-17 16:20:32

0

hProcess不得持有將被關閉的Process的ProcessHandle。它可以並且大多數時候都是NULL。我正在做類似的事情來獲取終止進程的PID。
if((hProcess == NULL) || (hProcess == GetCurrentProcess())){
pid = GetCurrentProcessId();
} else {
pid = ProcessHandleToId(hProcess); }

你確定,它是一個訪問權限問題,你的函數不會失敗,因爲句柄是NULL?