> ## 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

Recupera un identificador de un usuario que crea [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync).

## Sintaxis

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

### Parámetros

*async*   \_Inout\_\
Tipo: [XAsyncBlock\*](/reference/system/xasync/structs/xasyncblock)

El bloque asincrónico enviado a [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync).

*newUser*   \_Out\_\
Tipo: XUserHandle\*

Contiene un identificador del nuevo usuario.

### Valor devuelto

Tipo: HRESULT

Código de error o de operación correcta HRESULT.

| Código devuelto                             | Descripción                                                                                                                                                                                                                       |
| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| S\_OK                                       | La operación se realizó correctamente.                                                                                                                                                                                            |
| E\_GAMEUSER\_NO\_DEFAULT\_USER              | No hay disponible un usuario predeterminado. Es necesario llamar a [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync) sin [XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions). |
| E\_GAMEUSER\_RESOLVE\_USER\_ISSUE\_REQUIRED | El usuario debe usar una interfaz de usuario para resolver el problema. Llame a [XUserResolveIssueWithUiAsync](/reference/system/xuser/functions/xuserresolveissuewithuiasync) para mostrar la interfaz de usuario al usuario.    |
| E\_ABORT                                    | El usuario canceló la operación.                                                                                                                                                                                                  |

## Comentarios

**XUserAddAsync** inicia una operación asincrónica para agregar un usuario al juego. Use
[XUserAddResult](/reference/system/xuser/functions/xuseraddresult) para recuperar los resultados de la operación.

**XUserAddAsync** siempre muestra una interfaz de usuario del selector de cuentas a menos que pase
[XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions)
al parámetro *options*.

Si usa [XUserAddOptions::AddDefaultUserSilently](/reference/system/xuser/enums/xuseraddoptions), **XUserAddAsync** no muestra
ninguna interfaz de usuario. El usuario que devuelve **XUserAddOptions::AddDefaultUserSilently** se sigue devolviendo hasta que el usuario
cierra sesión. Si no hay disponible un usuario predeterminado, [XUserAddResult](/reference/system/xuser/functions/xuseraddresult) devuelve
**E\_GAMEUSER\_NO\_DEFAULT\_USER**. Esto indica que debe llamar a **XUserAddAsync** sin
**XUserAddOptions::AddDefaultUserSilently** para seleccionar un usuario.

Si un usuario tiene prohibido el acceso a XBOX Live, el juego no podrá obtener un XUserHandle para ese usuario.
Si se usa **XUserAddOptions::AddDefaultUserSilently** y el juego fue iniciado por un usuario con prohibición,
**XUserAddResult** devolverá E\_GAMEUSER\_NO\_DEFAULT\_USER. De lo contrario, si se muestra la interfaz de usuario, un usuario
sin prohibición deberá iniciar sesión, o bien el usuario deberá cancelar la interfaz de usuario y **XUserAddResult**
devolverá E\_ABORT.

No puede usar [XUserAddOptions::AllowGuests](/reference/system/xuser/enums/xuseraddoptions) con **XUserAddOptions::AddDefaultUserSilently**. Un invitado
no puede ser el usuario predeterminado. Puede usar **XUserAddOptions::AllowGuests** de forma segura independientemente de si la plataforma actual
admite invitados.

Debe cerrar cada identificador **XUserHandle** que recupere de una API de **XUsers** una vez llamando a
[XUserCloseHandle](/reference/system/xuser/functions/xuserclosehandle).

El siguiente ejemplo muestra cómo agregar de forma asincrónica un usuario a una sesión de juego.

```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;
}
```

## Requisitos

**Encabezado:** XUser.h

**Biblioteca:** xgameruntime.lib

**Plataformas compatibles:** Windows,Steam Deck, consolas de la familia XBOX One y consolas XBOX Series

## Documentación conceptual

* [Ejecutar una tarea de la API de Microsoft Game Development Kit (GDK)](/build/core-features/common/async/async-libraries/async-library-xasync-example-run-gdk-task)
* [Objetivos de diseño y mejoras de la programación asincrónica](/build/core-features/common/async/async-whitepaper)

## Consulte también

[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](/es/reference/system/xuser/enums/xuseraddoptions.md)
- [Ejemplo de ejecución de una tarea de la API del Microsoft Game Development Kit](/es/build/core-features/common/async/async-libraries/async-library-xasync-example-run-gdk-task.md)
- [Identidad de usuario y XUser](/es/build/core-features/common/user/player-identity-xuser.md)
- [XUserAddAsync](/es/reference/system/xuser/functions/xuseraddasync.md)
- [Inicialización del GDK](/es/build/steam-porting-guide/initializing-the-gdk.md)
