2010-09-10 41 views
1

在MSDN中的IsMemberOfAdministratorsGroup例如,有這樣的代碼:如果OpenThreadToken和OpenProcessToken都失敗,爲什麼需要清理?

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()失敗。當兩個函數失敗時是否有特殊情況,但是句柄是否分配?或者它只是一個錯字(反正他們是人類)?

回答

1

如果他們都失敗了,hToken仍然是0,和CloseHandle的()不會被調用....

+1

謝謝,如何在StackOverflow.com中正確地格式化代碼? – Phantom 2010-09-10 17:24:48

+0

當您輸入Qs和As時,在表單工具欄中有一個代碼按鈕(010101等) - 選擇您想要格式化的代碼,然後按此按鈕 – 2010-09-10 17:27:22

+0

或使用額外的4個空格縮進代碼。 – pmg 2010-09-10 17:29:59

1

你的代碼示例中的選擇性編輯隱藏的事實,即在原來的代碼中有一個OpenprocessToken調用和CLEANUP標籤之間的邏輯很多。在正常情況下(在獲取某個令牌時沒有錯誤),CLEANUP因此需要關閉打開的句柄。

這是一種蠻力的做法嘗試方式...最後,即使無法獲得令牌句柄,邏輯工作。

如果兩個調用都失敗,hToken將被取消設置,您不必關閉它。

+0

噢,蠻力的方式!我討厭它。 :-) – Phantom 2010-09-10 17:34:07

+0

但是我們也可以返回FALSE代替goto CLEANUP,對嗎? – Phantom 2010-09-10 17:40:19

+0

對不起,我的意思是在適當的setlasterror之後退出。 – Phantom 2010-09-10 17:42:17

相關問題