2011-04-25 37 views
0

env.c時(ERROR_ENVVAR_NOT_FOUND):遇到錯誤203調用CreateEnvironmentBlock()

#include <windows.h> 
#include <stdio.h> 
#include <Userenv.h> 
#include <Wtsapi32.h> 
int main() { 
    DWORD err; 
    HANDLE hTokenThis = NULL; 
    HANDLE hTokenDup = NULL; 
    HANDLE hThisProcess = GetCurrentProcess(); 
    OpenProcessToken(hThisProcess, TOKEN_ALL_ACCESS, &hTokenThis); 

    err=GetLastError(); 
    printf("err002:%d\n",err); 

    LPVOID pEnv = NULL; 
    CreateEnvironmentBlock(&pEnv, hTokenThis, TRUE); 

    err=GetLastError(); 
    printf("err003:%d\n",err); 
    return 0; 
} 

編譯和當前本地桌面的CMD.EXE運行:

gcc -o env.exe env.c -lUserenv 
env.exe 
err002:126 
err003:203 

OS是Win7和gcc是明明的4.5.2。

我很困惑的是,爲什麼它得到了錯誤203

+0

您可以調用'GetEnvironmentBlock',但不檢查返回值。你確定通話實際上失敗了嗎? – 2011-04-25 20:51:02

回答

3

注重WINAPI函數的返回值。只有在它們返回失敗代碼時才調用GetLastError()。

您傳遞給CreateEnvironmentBlock()的令牌必須是用戶令牌,通過調用LogonUser()獲得。

+0

你是什麼意思的「用戶令牌」? – wj32 2011-04-26 02:31:35

+0

代表用戶的令牌。檢查LogonUser文檔,最後一個參數。 – 2011-04-26 02:41:31

+0

嗯,我想知道你是什麼意思的「用戶令牌」,而不是...一些沒有用戶的其他類型的令牌? – wj32 2011-04-26 08:51:11