XUserAddAsync는 게임에 사용자를 추가하는 비동기 작업을 시작합니다. 작업 결과를 가져오려면
XUserAddResult를 사용합니다.XUserAddAsync는
XUserAddOptions::AddDefaultUserSilently를
options 매개변수에 전달하지 않는 한 항상 계정 선택 UI를 표시합니다.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를
안전하게 사용할 수 있습니다.XUsers API에서 가져오는 각 XUserHandle 핸들은
XUserCloseHandle을 호출하여 한 번 닫아야 합니다.다음 예제는 게임 세션에 사용자를 비동기적으로 추가하는 방법을 보여줍니다.
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;}