2010-08-17 4 views
3

J'ai une variable de type HANDLE. la première variable est un processus HANDLE (avec le nom hProcess) qui n'a pas droit d'accès PROCESS_QUERY_INFORMATION. deuxième variable est un processus HANDLE (avec le nom hwndProcess) aussi que j'ai ouvert via la fonction OpenProcess et avoir droit d'accès PROCESS_QUERY_INFORMATION. Je suis sûr que les deux processus est un. mais quand je compare comme ci-dessous return false; if (hProcess == hwndProcess) {faire quelque chose} comment dois-je faire?Comment comparer Deux variables de type HANDLE

Répondre

3

Il n'y a pas de manière explicite de vérifier si deux poignées se réfèrent au même processus. Le seul moyen serait d'interroger les informations de processus et de vérifier que, par ex. en utilisant GetProcessId sur chaque handle pour vérifier les ID de processus.

Si vous ne disposez pas des droits d'accès nécessaires pour appeler les fonctions de requête souhaitées, vous pouvez essayer d'appeler le DuplicateHandle pour obtenir un nouveau handle avec plus de droits d'accès. Cependant, si cela échoue, vous n'avez aucun moyen de dire si les poignées sont au même processus ou non.

+0

La syntaxe de DuplicateHandle est ci-dessous. BOOL WINAPI DuplicateHandle ( __in POIGNEE hSourceProcessHandle, __in POIGNEE hSourceHandle, __in POIGNEE hTargetProcessHandle, __out LPHANDLE lpTargetHandle, __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in DWORD dwOptions); dwOptions peut obtenir l'une des deux valeurs suivantes (DUPLICATE_CLOSE_SOURCE ou DUPLICATE_SAME_ACCESS) ou une combinaison de celles-ci. Maintenant, je peux joindre ces valeurs à l'aide de la balise PROCESS_QUERY_INFORMATION. – Phoenix

+0

Définissez dwOptions sur 0 et définissez dwDesiredAccess sur les droits d'accès requis (par exemple, PROCESS_QUERY_INFORMATION et tout ce dont vous avez besoin). –

0

hProcess ne doit pas contenir le ProcessHandle du Processus qui sera fermé. Il peut et sera la plupart du temps être NULL. Je fais quelque chose de similaire pour obtenir les PID des processus terminés.
if((hProcess == NULL) || (hProcess == GetCurrentProcess())){
pid = GetCurrentProcessId();
} else {
pid = ProcessHandleToId(hProcess); }

Êtes-vous sûr, c'est un problème de droits d'accès et votre fonction n'échoue pas, car le handle est NULL?