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

# XStoreQueryAssociatedProductsAsync

> XStoreQueryAssociatedProductsAsync

# XStoreQueryAssociatedProductsAsync

Obtiene información de descripción de la Store de los productos que los usuarios pueden comprar desde dentro del juego actual.

## Sintaxis

```cpp theme={null}
HRESULT XStoreQueryAssociatedProductsAsync(  
         const XStoreContextHandle storeContextHandle,  
         XStoreProductKind productKinds,  
         uint32_t maxItemsToRetrievePerPage,  
         XAsyncBlock* async  
)  
```

### Parámetros

*storeContextHandle*   \_In\_\
Tipo: XStoreContextHandle

El identificador del contexto de la tienda para el usuario devuelto por [XStoreCreateContext](/es/reference/system/xstore/functions/xstorecreatecontext.md).

*productKinds*   \_In\_\
Tipo: [XStoreProductKind](/es/reference/system/xstore/enums/xstoreproductkind.md)

El tipo de productos que se van a devolver.

*maxItemsToRetrievePerPage*   \_In\_\
Tipo: uint32\_t

El número máximo de elementos que se recuperarán por página.
El número de elementos devueltos por página puede variar de 0 a `maxItemsToRetrievePerPage`.
Para obtener más información, consulte [Paginación](#paging).

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

Un [XAsyncBlock](/es/reference/system/xasync/structs/xasyncblock.md) que define el trabajo asincrónico que se está realizando.
Use el [XAsyncBlock](/es/reference/system/xasync/structs/xasyncblock.md) para sondear el estado de la llamada y recuperar los resultados de la llamada.
Para obtener más información, consulte [XAsyncBlock](/es/reference/system/xasync/structs/xasyncblock.md).

### Valor devuelto

Tipo: HRESULT

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

## Comentarios

Para obtener la información de descripción de la Store y el resultado de la ejecución de esta función, llame a [XStoreQueryAssociatedProductsResult](/es/reference/system/xstore/functions/xstorequeryassociatedproductsresult.md) después de llamar a esta función.
[XStoreQueryAssociatedProductsResult](/es/reference/system/xstore/functions/xstorequeryassociatedproductsresult.md) contiene un `XStoreProductQueryHandle` que se enumera llamando a [XStoreEnumerateProductsQuery](/es/reference/system/xstore/functions/xstoreenumerateproductsquery.md).

No es posible conocer de antemano el número de productos que devuelve esta consulta.

Esta API solo devuelve productos que los usuarios pueden examinar en Microsoft Store o comprar dentro del juego.
Los resultados no incluyen ningún producto que esté oculto, expirado o eliminado de la tienda.
Si necesita detalles de un producto de este tipo, use [XStoreQueryProductsAsync](/es/reference/system/xstore/functions/xstorequeryproductsasync.md) y pase el identificador de la tienda del producto.

## Paginación

Esta función devuelve productos en varias páginas (hasta `maxItemsToRetrievePerPage` elementos en una sola página).
Use [XStoreProductsQueryHasMorePages](/es/reference/system/xstore/functions/xstoreproductsqueryhasmorepages.md) y [XStoreProductsQueryNextPageAsync](/es/reference/system/xstore/functions/xstoreproductsquerynextpageasync.md)/[XStoreProductsQueryNextPageResult](/es/reference/system/xstore/functions/xstoreproductsquerynextpageresult.md) para procesar todos los resultados paginados.
La paginación no está completa hasta que `XStoreProductsQueryHasMorePages` devuelve false.

> [!NOTE]
>
> La paginación puede comportarse de forma diferente entre los sandboxes y RETAIL.
> En un sandbox, los elementos se acumulan hasta `maxItemsToRetrievePerPage` antes de que se devuelva una página.
> En RETAIL, es habitual que se devuelvan de 0 a 1 elementos por página.
>
> Es importante que todos los juegos que usen esta API implementen y prueben la paginación antes del lanzamiento.
>
> Para probar el comportamiento de la paginación en un sandbox, establezca temporalmente `maxItemsToRetrievePerPage` en un valor inferior al número de productos publicados en su sandbox.
> Para probar en RETAIL antes del lanzamiento de su juego, publique productos con la opción **Enable Private Audience** de la página 'Pricing and availability' de Partner Center.
> Para probar en RETAIL después del lanzamiento de su juego, use un paquete piloto.

El código siguiente muestra cómo recuperar resultados de consultas de productos en varias páginas.

Asegúrese de que el identificador de consulta se pase a través de la recursión de paginación para evitar pérdidas.

```cpp theme={null}
struct QueryContext
{
    uint32_t count = 0;  // used to accumulate count of products returned across pages
    XStoreProductQueryHandle handle = nullptr;  // handle to reuse for paged operations
};

void CleanupProductQuery(XAsyncBlock* async)
{
    if (!async) return;

    auto* ctx = static_cast<QueryContext*>(async->context);
    if (ctx)
    {
        if (ctx->handle)
        {
            XStoreCloseProductsQueryHandle(ctx->handle);
            ctx->handle = nullptr;
        }

        delete ctx;
        async->context = nullptr;
    }

    delete async;
}

bool CALLBACK ProductEnumerationCallback(const XStoreProduct* product, void* context)
{
    // Use result of query
    auto* ctx = static_cast<QueryContext*>(context);

    // Empty results are possible and should be skipped
    if (product)
    {
        printf("%s %s %u\n", product->title, product->storeId, product->productKind);
        ctx->count++;
    }

    return true;
}

void CALLBACK QueryAssociatedProductsCallback(XAsyncBlock* async)
{
    auto* ctx = static_cast<QueryContext*>(async->context);

    HRESULT hr = XStoreQueryAssociatedProductsResult(async, &ctx->handle);
    if (FAILED(hr)) { CleanupProductQuery(async); return; }

    hr = XStoreEnumerateProductsQuery(ctx->handle, ctx, ProductEnumerationCallback);
    if (FAILED(hr)) { CleanupProductQuery(async); return; }

    // Check if there are more pages to process
    if (XStoreProductsQueryHasMorePages(ctx->handle))
    {
        QueryNextPage(async);
        return;
    }

    printf("Enumeration complete, %u products found\n", ctx->count);
    CleanupProductQuery(async);
}

void QueryAssociatedProducts(XStoreContextHandle storeContextHandle, XTaskQueueHandle taskQueueHandle)
{
    auto async = new XAsyncBlock{};
    async->context = new QueryContext{ 0, nullptr };
    async->queue = taskQueueHandle;
    async->callback = QueryAssociatedProductsCallback;

    XStoreProductKind typeFilter =
        XStoreProductKind::Consumable |
        XStoreProductKind::Durable |
        XStoreProductKind::Game |
        XStoreProductKind::Pass |
        XStoreProductKind::UnmanagedConsumable;

    HRESULT hr = XStoreQueryAssociatedProductsAsync(
        storeContextHandle,
        typeFilter,
        25,          // Products per page (25 is a good default, can set lower to verify paging in sandbox)
        async);

    if (FAILED(hr))
    {
        CleanupProductQuery(async);
    }
}

// In RETAIL, content will be returned across multiple pages.
// Paging is not complete until XStoreProductsQueryHasMorePages returns false.
void QueryNextPage(XAsyncBlock *async)
{
    async->callback = [](XAsyncBlock* async)
    {
        auto* ctx = static_cast<QueryContext*>(async->context);

        XStoreProductQueryHandle next = nullptr;
        HRESULT hr = XStoreProductsQueryNextPageResult(async, &next);
        if (FAILED(hr)) { CleanupProductQuery(async); return; }

        // Safe swap: avoids leaks if 'next' is a new handle, avoids double-close if identical
        if (next && next != ctx->handle)
        {
            if (ctx->handle) XStoreCloseProductsQueryHandle(ctx->handle);
            ctx->handle = next;
        }
        else
        {
            ctx->handle = next; // covers null or same-handle cases
        }

        hr = XStoreEnumerateProductsQuery(ctx->handle, ctx, ProductEnumerationCallback);
        if (FAILED(hr)) { CleanupProductQuery(async); return; }

        // Check if there are more pages to process
        if (XStoreProductsQueryHasMorePages(ctx->handle))
        {
            QueryNextPage(async);
            return;
        }

        printf("Enumeration complete, %u products found\n", ctx->count);
        CleanupProductQuery(async);
    };

    auto* ctx = static_cast<QueryContext*>(async->context);
    HRESULT hr = XStoreProductsQueryNextPageAsync(ctx->handle, async);
    if (FAILED(hr))
    {
        CleanupProductQuery(async);
    }
}

```

## Requisitos

**Encabezado:** XStore.h (incluido en XGameRuntime.h)

**Biblioteca:** xgameruntime.lib

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

## Documentación conceptual

* [Implementación de compras dentro del juego en su juego](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/pc-dev/tutorials/pc-e2e-guide/e2e-services/e2e-in-game-purchases)
* [Operaciones básicas de la tienda](/es/publishing/xstore-commerce/xstore-basic-operations.md)
* [Concesión a los jugadores de acceso al contenido de complementos](/es/publishing/xstore-commerce/xstore-granting-access.md)
* [Información general de los sistemas de comercio de GDK](/es/publishing/xstore-commerce/xstore-overview.md)
* [Limitación de frecuencia detallada para las API de Microsoft Store](/es/publishing/xstore-commerce/xstore-fgrl.md)
* [Herramienta de derechos de desarrollo de la tienda (DevEntitlementTool.exe)](/es/tools/tools-services/live-dev-entitlements-tool.md)

## Consulte también

[XStore](/es/reference/system/xstore/xstore_members.md)\
[XStoreQueryAssociatedProductsResult](/es/reference/system/xstore/functions/xstorequeryassociatedproductsresult.md)\
[XStoreEnumerateProductsQuery](/es/reference/system/xstore/functions/xstoreenumerateproductsquery.md)\
[XStoreProductsQueryHasMorePages](/es/reference/system/xstore/functions/xstoreproductsqueryhasmorepages.md)\
[XStoreProductsQueryNextPageAsync](/es/reference/system/xstore/functions/xstoreproductsquerynextpageasync.md)\
[Operaciones básicas de la tienda](/es/publishing/xstore-commerce/xstore-basic-operations.md)\
[Concesión a los jugadores de acceso al contenido de complementos](/es/publishing/xstore-commerce/xstore-granting-access.md)


## Related topics

- [XStoreQueryAssociatedProductsResult](/es/reference/system/xstore/functions/xstorequeryassociatedproductsresult.md)
- [XStoreQueryAssociatedProductsForStoreIdAsync](/es/reference/system/xstore/functions/xstorequeryassociatedproductsforstoreidasync.md)
- [XStoreQueryProductsAsync](/es/reference/system/xstore/functions/xstorequeryproductsasync.md)
- [XStoreQueryProductForPackageAsync](/es/reference/system/xstore/functions/xstorequeryproductforpackageasync.md)
- [XStoreProductQueryCallback](/es/reference/system/xstore/functions/xstoreproductquerycallback.md)
