Зачем нужна очистка, если и OpenThreadToken, и OpenProcessToken не работают? - PullRequest
1 голос
/ 10 сентября 2010

В примере IsMemberOfAdministratorsGroup в MSDN есть код, подобный следующему:

if (!OpenThreadToken (GetCurrentThread(), TOKEN_QUERY|TOKEN_DUPLICATE, TRUE, &hToken))
{
  if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &hToken))
  {
    lastErr = GetLastError();
    goto CLEANUP;
  }
}

....

CLEANUP:
  if (hToken)
  {
     CloseHandle (hToken);
     hToken = NULL;  // Set variable to same state as resource.
  }

Я не понимаю, почему мы должны пытаться закрыть дескриптор токена, если OpenThreadToken ()или OpenProcessToken () завершается ошибкой.Есть ли особое условие, когда две функции не работают, но дескриптор выделен?Или это просто опечатка (они все равно люди)?

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Ваше выборочное редактирование примера кода скрывает тот факт, что в исходном коде есть много логики между вызовами OpenprocessToken и меткой CLEANUP.В обычном случае (когда нет ошибки при получении того или иного токена), CLEANUP, следовательно, требуется, чтобы закрыть открытый дескриптор.

Это грубый метод выполнения try ... finally логика, которая работает, даже если не удается получить дескриптор токена.

Если оба вызова завершатся неудачно, hToken будет сброшен, и вы не будете 'это нужно закрыть.

1 голос
/ 10 сентября 2010

Если они оба потерпят неудачу, hToken все равно будет 0, и CloseHandle () не будет вызван ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...