> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XUserAddResult

> XUserAddResult

# XUserAddResult

获取由 [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync) 创建的用户的句柄。

## 语法

```cpp theme={null}
HRESULT XUserAddResult(  
         XAsyncBlock* async,  
         XUserHandle* newUser  
)  
```

### 参数

*async*   \_Inout\_\
类型：[XAsyncBlock\*](/reference/system/xasync/structs/xasyncblock)

发送给 [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync) 的异步块。

*newUser*   \_Out\_\
类型：XUserHandle\*

包含新用户的句柄。

### 返回值

类型：HRESULT

HRESULT 成功或错误代码。

| 返回代码                                        | 说明                                                                                                                                                                                 |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| S\_OK                                       | 操作成功。                                                                                                                                                                              |
| E\_GAMEUSER\_NO\_DEFAULT\_USER              | 没有可用的默认用户。需要在不使用 [XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions) 的情况下调用 [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync)。 |
| E\_GAMEUSER\_RESOLVE\_USER\_ISSUE\_REQUIRED | 用户必须使用 UI 来解决该问题。调用 [XUserResolveIssueWithUiAsync](/reference/system/xuser/functions/xuserresolveissuewithuiasync) 以向用户显示 UI。                                                      |
| E\_ABORT                                    | 用户取消了操作。                                                                                                                                                                           |

## 注解

**XUserAddAsync** 启动一项异步操作，将用户添加到游戏中。使用
[XUserAddResult](/reference/system/xuser/functions/xuseraddresult) 检索该操作的结果。

**XUserAddAsync** 始终会显示帐户选择器 UI，除非你将
[XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions)
传递给 *options* 参数。

如果使用 [XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions)，**XUserAddAsync** 不会显示 UI。**XUserAddOptions::AddDefaultUserSilently** 所返回的用户将持续返回，直到该用户注销。如果没有可用的默认用户，[XUserAddResult](/reference/system/xuser/functions/xuseraddresult) 会返回 **E\_GAMEUSER\_NO\_DEFAULT\_USER**。这表示你必须在不使用 **XUserAddOptions::AddDefaultUserSilently** 的情况下调用 **XUserAddAsync** 来选择用户。

如果用户被 XBOX Live 封禁，游戏将无法获取该用户的 XUserHandle。如果使用了 **XUserAddOptions::AddDefaultUserSilently** 且游戏由被封禁的用户启动，**XUserAddResult** 将返回 E\_GAMEUSER\_NO\_DEFAULT\_USER。否则，如果显示 UI，则要么需要未被封禁的用户登录，要么用户需要取消 UI，此时 **XUserAddResult** 将返回 E\_ABORT。

不能将 [XUserAddOptions::AllowGuests](/reference/system/xuser/enums/xuseraddoptions) 与 **XUserAddOptions::AddDefaultUserSilently** 一起使用。来宾不能成为默认用户。无论当前平台是否支持来宾，都可以安全地使用 **XUserAddOptions::AllowGuests**。

对于从 **XUsers** API 检索到的每个 **XUserHandle** 句柄，都必须通过调用 [XUserCloseHandle](/reference/system/xuser/functions/xuserclosehandle) 关闭一次。

以下示例演示了如何以异步方式将用户添加到游戏会话中。

```cpp theme={null}
HRESULT AddUserComplete(XAsyncBlock* ab)
{
    unique_user_handle user;
    RETURN_IF_FAILED(XUserAddResult(ab, &user));

    XUserLocalId userLocalId;
    XUserGetLocalId(user.get(), &userLocalId);

    auto iter = std::find_if(
        _users.begin(),
        _users.end(),
        [&userLocalId](const User& candidate)
    {
        XUserLocalId candidateUserLocalId;
        XUserGetLocalId(candidate.Handle(), &candidateUserLocalId);
        return candidateUserLocalId == userLocalId;
    });

    // User already known
    if (iter != _users.end())
    {
        appLog.AddLog("User already in list\n");
        return S_OK;
    }

    try
    {
        _users.emplace_back(user.get());
        _users.back().LoadGamerPicAsync(_queue);
    }
    CATCH_RETURN();

    return S_OK;
}

HRESULT AddUser(bool allowGuests, bool silent)
{
    auto asyncBlock = std::make_unique<XAsyncBlock>();
    ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
    asyncBlock->queue = _queue;
    asyncBlock->context = this;
    asyncBlock->callback = [](XAsyncBlock* ab)
    {
        auto asyncBlock = std::unique_ptr<XAsyncBlock>(ab);
        LOG_IF_FAILED(static_cast<UserWindow*>(ab->context)->AddUserComplete(ab));
    };

    XUserAddOptions options = XUserAddOptions::None;

    if (allowGuests)
    {
        WI_SET_FLAG(options, XUserAddOptions::AllowGuests);
    }

    if (silent)
    {
        WI_SET_FLAG(options, XUserAddOptions::AddDefaultUserSilently);
    }

    if (SUCCEEDED_LOG(XUserAddAsync(
        options,
        asyncBlock.get())))
    {
        // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
        // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
        asyncBlock.release();
    }

    return S_OK;
}
```

## 要求

**头文件：** XUser.h

**库：** xgameruntime.lib

**支持的平台：** Windows、Steam Deck、XBOX One 系列主机和 XBOX Series 主机

## 概念文档

* [运行 Microsoft 游戏开发工具包 (GDK) API 任务](/build/core-features/common/async/async-libraries/async-library-xasync-example-run-gdk-task)
* [异步编程设计目标和改进](/build/core-features/common/async/async-whitepaper)

## 另请参阅

[XUser](/reference/system/xuser/xuser_members)

[XUserAddAsync](/reference/system/xuser/functions/xuseraddasync)

[XUserAddOptions](/reference/system/xuser/enums/xuseraddoptions)

[XUserCloseHandle](/reference/system/xuser/functions/xuserclosehandle)


## Related topics

- [XUserAddOptions](/zh-CN/reference/system/xuser/enums/xuseraddoptions.md)
- [运行 Microsoft Game Development Kit API 任务示例](/zh-CN/build/core-features/common/async/async-libraries/async-library-xasync-example-run-gdk-task.md)
- [用户身份与 XUser](/zh-CN/build/core-features/common/user/player-identity-xuser.md)
- [XUserAddAsync](/zh-CN/reference/system/xuser/functions/xuseraddasync.md)
- [初始化 GDK](/zh-CN/build/steam-porting-guide/initializing-the-gdk.md)
