次の方法で共有


XUserAddResult

XUserAddAsync の作成したユーザーへのハンドルを取得します。

構文

HRESULT XUserAddResult(  
         XAsyncBlock* async,  
         XUserHandle* newUser  
)  

パラメーター

async _Inout_
型: XAsyncBlock*

XUserAddAsync に送信された非同期ブロック。

newUser _Out_
型: XUserHandle*

新しいユーザーへのハンドルが格納されます。

戻り値

型: HRESULT

HRESULT 成功またはエラー コード。

リターン コード 説明
S_OK 操作に成功しました。
E_GAMEUSER_NO_DEFAULT_USER 既定のユーザーがいません。 XUserAddAsyncXUserAddOptions::AddDefaultUserSilently なしで呼び出す必要があります。
E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED ユーザーは、UI を使用して問題を解決する必要があります。 XUserResolveIssueWithUiAsync を呼び出して、ユーザーに UI を表示してください。
E_ABORT ユーザーが処理をキャンセルしました。

解説

XUserAddAsync は、ユーザーをゲームに追加する非同期操作を開始します。 XUserAddResult を使用して、操作の結果を取得します。

XUserAddAsync は、options パラメーターに XUserAddOptions::AddDefaultUserSilently を渡さない限り、常にアカウント ピッカー UI を表示します。

XUserAddOptions::AddDefaultUserSilently を使用すると、XUserAddAsync は UI を表示しません。 XUserAddOptions::AddDefaultUserSilently が返すユーザーは、そのユーザーがサインアウトするまで、引き続き返されます。既定のユーザーがない場合、XUserAddResultE_GAMEUSER_NO_DEFAULT_USER を返します。 これは、XUserAddOptions::AddDefaultUserSilently なしで XUserAddAsync を呼び出してユーザーを選択する必要があることを示します。

ユーザーが Xbox Live から禁止されている場合、ゲームはそのユーザーの XUser Handle を取得できません。 XUserAddOptions::AddDefaultUserSilently が使用され、禁止されたユーザーによってゲームが起動された場合、XUserAddResult は E_GAMEUSER_NO_DEFAULT_USER を再実行します。 それ以外の場合、UI が表示されている場合は、禁止されていないユーザーがサインインするか、ユーザーが UI をキャンセルして、XUserAddResult が E_ABORT を返す必要があります。

XUserAddOptions::AllowGuestsXUserAddOptions::AddDefaultUserSilently と一緒に使用できません。 ゲストを既定ユーザーにすることはできません。 XUserAddOptions::AllowGuests は、現在のプラットフォームでゲストがサポートされるかどうかにかかわらず確実に使用できます。

XUserCloseHandle を呼び出して XUser API から取得した各 XUserHandle ハンドルを 1 回閉じる必要があります。

次の例は、非同期的にユーザーをゲーム セッションに追加する方法を示しています。

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 本体

関連項目

XUser

XUserAddAsync

XUserAddOptions

XUserCloseHandle