如果OpenThreadToken和OpenProcessToken都失败,为什么需要清理?

时间:2010-09-10 17:20:05

标签: winapi error-handling

在MSDN的IsMemberOfAdministratorsGroup示例中,有如下代码:

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 个答案:

答案 0 :(得分:1)

如果它们都失败了,hToken仍然是0,并且不会调用CloseHandle()....

答案 1 :(得分:1)

您对代码示例的选择性编辑隐藏了这样的事实:在原始代码中,OpenprocessToken调用和CLEANUP标签之间存在大量逻辑。在正常情况下(获取一个或另一个令牌时没有错误),因此需要CLEANUP关闭打开的句柄。

这是一种蛮力的尝试方式......即使无法获得令牌句柄,最终的逻辑也能正常工作。

如果两个调用都失败,则hToken将被取消设置,您不必关闭它。