在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()失败,我不明白为什么我们需要尝试关闭令牌句柄。两个函数失败时是否存在特殊情况,但是句柄是否已分配?或者它只是一个错字(无论如何它们都是人类)?
答案 0 :(得分:1)
如果它们都失败了,hToken仍然是0,并且不会调用CloseHandle()....
答案 1 :(得分:1)
您对代码示例的选择性编辑隐藏了这样的事实:在原始代码中,OpenprocessToken调用和CLEANUP标签之间存在大量逻辑。在正常情况下(获取一个或另一个令牌时没有错误),因此需要CLEANUP关闭打开的句柄。
这是一种蛮力的尝试方式......即使无法获得令牌句柄,最终的逻辑也能正常工作。
如果两个调用都失败,则hToken将被取消设置,您不必关闭它。