XUserAddResult
检索 XUserAddAsync 创建的用户的句柄。
语法
HRESULT XUserAddResult(
XAsyncBlock* async,
XUserHandle* newUser
)
参数
async _Inout_
类型:XAsyncBlock*
发送到 XUserAddAsync 的异步块。
newUser _Out_
类型:XUserHandle*
包含新用户的句柄。
返回值
类型:HRESULT
HRESULT 成功或错误代码。
返回代码 | 说明 |
---|---|
S_OK | 操作成功。 |
E_GAMEUSER_NO_DEFAULT_USER | 默认用户不可用。 需要不带 XUserAddOptions::AddDefaultUserSilently 调用 XUserAddAsync。 |
E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED | 用户必须使用 UI 来解决问题。 调用 XUserResolveIssueWithUiAsync 以向用户显示 UI。 |
E_ABORT | 用户取消了操作。 |
备注
XUserAddAsync 启动一个异步操作来将用户添加到游戏。 使用 XUserAddResult 检索该操作的结果。
XUserAddAsync 始终显示帐户选取器 UI,除非您将 XUserAddOptions::AddDefaultUserSilently 传递到 options 参数。
如果使用 XUserAddOptions::AddDefaultUserSilently,XUserAddAsync 将不显示任何 UI。 XUserAddOptions::AddDefaultUserSilently 返回的用户将继续返回,直到该用户注销。如果默认用户不可用,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 与 XUserAddOptions::AddDefaultUserSilently 一起使用。 访客不能是默认用户。 可以安全地使用 XUserAddOptions::AllowGuests,无论当前平台是否支持访客。
必须通过调用 XUserCloseHandle 关闭从 XUser API 检索到的每个 XUserHandle 句柄一次。
下面的示例演示如何将用户异步添加到游戏会话。
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、Xbox One 系列主机和 Xbox Series 主机