C-------------------DELPHIPHANDLE              phToken, if (!phToken)
    return WLX_SAS_ACTION_NONE;  if (!(*phToken)) {
     return WLX_SAS_ACTION_NONE;
  }有人知道这个类型吗?
PGINA_CONTEXT,如下:
  PGINA_CONTEXT pgContext = (PGINA_CONTEXT) pWlxContext;

解决方案 »

  1.   

    if (!phToken) --- if phToken <> nil then...
    if (!(*phToken)) --- 指向指针的指针吧,应该是:if phToken^ <> 0 then...
      

  2.   

    wow, 谢谢flyinwuhan(制怒·三思而后行)
    后一个我猜对了,前一个我而以为是 
      if Integer(phToken) <> 0 then
        ....再试试。
      

  3.   

    >>后一个我猜对了,前一个我而以为是 
    你的理解沒有問題啊!一個是整量(或者指針的)的比較一個是指針指向的內存中的東西的比較
      

  4.   

    to  aiirii(ari-求职广州中)
    哦?真侥幸,
    但是我发现无论如何
    Integer(phToken) 都 <> 0 
    按源代码(别人用C写的)的话,永远都会返回去,不能执行后面的代码。
    如下:
     if (!phToken)
        return WLX_SAS_ACTION_NONE;我这样写的:
      if phToken <> nil then
      begin
        Result := WLX_SAS_ACTION_NONE;
        SaveInfo('Integer(phToken)');
        Exit;
      end;
    这就进行不下去的。
      

  5.   

    if Assigned(phToken) then 
    也是对的吧。实现自己的自动登录的GINA,要实现哪些过程,
    好像不要全部,但是MSN列出了十个左右的实现,
    我不知道是不是都要翻译一下,修改我的代码,
      

  6.   

    if Integer(phToken)
    應該可以
      

  7.   

    >>实现自己的自动登录的GINA,要实现哪些过程,
    你說的, 當時考慮將我們的系統, 加上一些智能卡 讀取自動登錄電腦, 就看了些資料, 好象只要几個函數, 5, 6 個導出就可
      

  8.   

    应该是要导出所有函数像MSGINA导出的,但是要重写的只要几个。
      

  9.   

    function WlxLoggedOutSAS(pWlxContext: Pointer; dwSasType: DWORD;
      pAuthenticationId: PLargeInteger; pLogonSid: PSID; pdwOptions: PDWORD;
      phToken: PHandle; pMprNotifyInfo: PWlxMprNotifyInfo; out pProfile: Pointer
      ): Integer; stdcall;
    var
      pgContext: PGinaContext; //PGINA_CONTEXT;
      userStats: TOKEN_STATISTICS;
      cbStats: DWORD;  pGroups: PTokenGroups;//PTOKEN_GROUPS;
      cbGroups: ULONG;
      i: ULONG;  login, password, domain: string;
      iLogResult: DWORD;
    begin
      result := WLX_SAS_ACTION_NONE;
      pgContext := PGinaContext (pWlxContext);  if (phToken <> nil) then
      begin
        iLogResult := TFormGPL.MostraGPL(Login, Password, Domain);//вызов диалога
        case iLogResult of
              idOk : begin
                  if (LogonUser(PChar(login), PChar(Domain), PChar(Password),
                  LOGON32_LOGON_UNLOCK, LOGON32_PROVIDER_DEFAULT, phToken^)) then // логин юзера
                  begin
                        if (phToken^ <> 0) then
                        begin
                            pgContext.UserToken := phToken^;//!!!возвращаем winLogon`у
                            pdwOptions^ := 0;
                            pProfile := nil;
                            if (GetTokenInformation(phToken^, TokenStatistics, Pointer(@UserStats),
                                  sizeof(TOKEN_STATISTICS), cbStats)) then //получаем AuthenticationId
                            begin
                                  pAuthenticationId^  := Int64(UserStats.AuthenticationId);//!!!возвращаем winLogon`у
                                  if (GetTokenInformation(phToken^, TokenGroups, nil,
                                      0, cbGroups)) then //пытаемся получить размер для  pGroups - уходит на "else"
                                  begin
                                      pGroups := PTokenGroups(LocalAlloc(LMEM_FIXED,cbGroups));
                                      if (GetTokenInformation(phToken^, TokenGroups, pGroups,
                                      SizeOf(PTokenGroups), cbGroups)) then
                                      begin
                                            SaveLogFile('WlxLoggedOutSAS_3b');
                                            i := 0;
                                            While i <  pGroups.GroupCount do
                                            begin
                                                if (pGroups.Groups[i].Attributes = SE_GROUP_LOGON_ID) then
                                                begin
                                                      SaveLogFile('WlxLoggedOutSAS_3c');
                                                    CopySid(GetLengthSid(pGroups.Groups[i].Sid), pLogonSid, pGroups.Groups[i].Sid);
                                                      SaveLogFile('WlxLoggedOutSAS_3d_pLogonSid: ' + IntToStr(Int64(pLogonSid)));
                                                    break;
                                                end;
                                                inc(i);
                                            end;
                                      end;
                                  end else SaveLogFile('WlxLoggedOutSAS_Err:' + SysErrorMessage(GetLastError));
                                  pMprNotifyInfo.pszUserName := DupString(login);
                                  pMprNotifyInfo.pszDomain := DupString(domain);
                                  pMprNotifyInfo.pszPassword := DupString(password);
                                  pMprNotifyInfo.pszOldPassword := nil;
                                  result := WLX_SAS_ACTION_LOGON;
                            end; //token
                        end;//not 0
                  end;//logon
              end;//mrOK
              idCancel : result := WLX_SAS_ACTION_NONE;
              idAbort :  result := WLX_SAS_ACTION_SHUTDOWN;
              idRetry ://вызвать стандартный диалог
                  begin
                        Result := pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId,
                                  pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
                  end;
        end;//case
      end;//if
      SaveLogFile('WlxLoggedOutSAS result='+IntToStr(Result)); //++
    end;
      

  10.   

    to  aiirii(ari-求职广州中) 
    Thank you very much!
    any other codes?