AdjustTokenPrivileges(hToken,   FALSE,   tkp,   0,nil,   Nothing);故障显示:[Error] Unit1.pas(79): Ambiguous overloaded call to 'AdjustTokenPrivileges'

解决方案 »

  1.   

    AdjustTokenPrivileges(hToken,  FALSE,  tkp,  0,PTokenPrivileges(nil),  Nothing); 
      

  2.   

    procedure TForm_welcome.Image5Click(Sender: TObject);
    var
          VerInfo:TOSVersionInfo;
          hToken:THANDLE;
          tkp:TOKEN_PRIVILEGES;
          Nothing:Cardinal;
    begin
     VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);
          GetVersionEx(VerInfo);
          if   VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT   then
          Begin
              OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES   or   TOKEN_QUERY,hToken);
              LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);
              tkp.PrivilegeCount:=   1;
              tkp.Privileges[0].Attributes:=   SE_PRIVILEGE_ENABLED;
              AdjustTokenPrivileges(hToken,   FALSE,   tkp,   0,PTokenPrivileges(nil),   Nothing);
          End;
              ExitWindowsEx(EWX_POWEROFF,0);end;
    故障显示:[Error] Unit1.pas(79): Ambiguous overloaded call to 'AdjustTokenPrivileges'
      

  3.   

    我试了一下代码没问题,直接给我关电源了,汗
    看了一下delphi6的windows单元的定义,AdjustTokenPrivileges有两个重载函数function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
      const NewState: TTokenPrivileges; BufferLength: DWORD;
      var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; external advapi32 name 'AdjustTokenPrivileges';
    function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
      const NewState: TTokenPrivileges; BufferLength: DWORD;
      PreviousState: PTokenPrivileges; var ReturnLength: DWORD): BOOL; external advapi32 name 'AdjustTokenPrivileges';
    试试用另一个函数改成这样:var
       NewState: TTokenPrivileges;
    //......
       AdjustTokenPrivileges(hToken,  FALSE,  tkp,  0, NewState,  Nothing);
      

  4.   

    试了,还是没用
       我新建个工程,是有用的
         但是到我搞的那个程序里,添加了,运行就会出现那个错误故障显示:[Error] Unit1.pas(79): Ambiguous overloaded call to 'AdjustTokenPrivileges'
      

  5.   

    那是你的程序里又另外声明了一个AdjustTokenPrivileges,整个项目查找一下,找到声明部分,去掉
      

  6.   

    写成windows.AdjustTokenPrivileges(hToken,  FALSE,  tkp,  0,PTokenPrivileges(nil),  Nothing); 
    这样会报错吗?
      

  7.   

    这是以前写的SHUTDOWN的代码;function ShutDown(uFlags: Cardinal):boolean;
    const
      ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
      SHTDWN_PRIV = 'SeShutdownPrivilege';
      PRIV_SIZE   = sizeOf(TTokenPrivileges);var
      Len: DWORD;
      TokenPriv, Dummy: TTokenPrivileges;
      Token: THandle;
      Error:integer;
    begin
      error:=0;
      if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
          Error := Error or 4;
      if not LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid) then
        Error := Error or 8;
      TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      TokenPriv.PrivilegeCount := 1;  // One privilege to set
      if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len) then
        Error:=Error or 16;
      ExitWindowsEx(uFlags, 0);
      Result := (Error=0);
    end;
    这是一个重载的函数.你注意下第五个参数是:TTokenPrivileges 类型的.
      

  8.   

    AdjustTokenPrivileges是API?关注。。