使用OpenProcessToken()用于得到指定进程的访问令牌,而第三个参数定义设置不正确可能导致该函数调用失败,以下举例说明: HANDLE hProc; 
hProc = GetCurrentProcess(); // Method1 - Error(998) 
HANDLE *hToken; 
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, hToken); // Method2 - Success 
HANDLE hToken; 
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken); 以上是获取访问令牌的调用,OpenProcessToken()函数原型如下: BOOL WINAPI OpenProcessToken( 
  __in          HANDLE ProcessHandle, 
  __in          DWORD DesiredAccess, 
  __out        PHANDLE TokenHandle 
); 方法1和方法2都使用HANDLE类型定义,方法1定义指针,方法2定义变量,但方法1调用函数返回失败(通过GetLastError()可知错误代码为998——拒绝访问);方法2调用函数则能成功获取访问令牌。为什么出现这种情况呢?WinNT.h中相关的定义引起,如下: #ifdef STRICT 
typedef void *HANDLE; 
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name 
#else 
typedef PVOID HANDLE; 
#define DECLARE_HANDLE(name) typedef HANDLE name 
#endif 
typedef HANDLE *PHANDLE; 由此可见可以把任意一种类型的指针赋值给PVOID型,因此PVOID*赋给PVOID型是可以的,而把PVOID型赋值给PVOID*型也可以。问我周围的人时说HANDLE *hToken;定义了,但没分配空间,但我后来我用了下面:HANDLE *hToken = new HANDLE; 
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, hToken); 执行OpenProcessToken()执行后hToken没有什么变化啊,还是new时候的值,这有问题吗? 

解决方案 »

  1.   

    OpenProcessToken 的第3个参数是 __out 的,也就是说,函数运行后把打开的proess token通过这个参数传出来~这样类比一下你就明白你说的第一种方式为什么会出问题了
    bool sum(int a, int b, int * result)
    {
        if ( NULL == result)
            return false;    *result = a + b;
        return true;
    }正确的调用显然应该是
    int result;
    sum(1,2, &result);   //对应你上面的方法2你的方法1就好比是这样调用:
    int * r1;
    sum(1,2, r1);  // r1是个野指针,你想一下,sum中对其赋值会发生什么情况?你的最后一种方法(HANDLE *hToken = new HANDLE;)是正确的,虽然hToken没有什么变化,但hToken指向的内容是变了的
    就好比这样调用
    int * r2 = new int;
    sum(1,2,r2);  // 调用之后r2的地址不会变,但是 *r2的值已经变成3了