winapi uwp windows-10 project-centennial desktop-bridge

winapi - ¿Cómo acceder al espacio de nombres de Windows.Services.Store desde una aplicación Win32 convertida a UWP con el "Conversor de Project Centennial" para habilitar las compras en la aplicación?



windows-10 project-centennial (3)

Use WRL. Aquí hay un ejemplo de cómo comprar una aplicación en la compra:

#include <windows.h> #include <Windows.Services.Store.h> #include <wrl.h> using namespace ABI::Windows::Foundation; using namespace ABI::Windows::Services::Store; using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers; #define CheckHr(hr) do { if (FAILED(hr)) __debugbreak(); } while (false) const wchar_t kItemFriendlyName[] = L"10 coins"; const wchar_t kItemStoreId[] = L"ten_coins"; void OnPurchaseOperationDone(IAsyncOperation<StorePurchaseResult*>* operation, AsyncStatus status); void Purchase10Coins() { ComPtr<IStoreContextStatics> storeContextStatics; auto hr = RoGetActivationFactory(HStringReference(L"Windows.Services.Store.StoreContext").Get(), __uuidof(storeContextStatics), &storeContextStatics); CheckHr(hr); ComPtr<IStoreContext> storeContext; hr = storeContextStatics->GetDefault(&storeContext); CheckHr(hr); ComPtr<IStorePurchasePropertiesFactory> purchasePropertiesFactory; hr = RoGetActivationFactory(HStringReference(L"Windows.Services.Store.StorePurchaseProperties").Get(), __uuidof(purchasePropertiesFactory), &purchasePropertiesFactory); CheckHr(hr); ComPtr<IStorePurchaseProperties> purchaseProperties; hr = purchasePropertiesFactory->Create(HStringReference(kItemFriendlyName).Get(), &purchaseProperties); CheckHr(hr); ComPtr<IAsyncOperation<StorePurchaseResult*>> purchaseOperation; hr = storeContext->RequestPurchaseWithPurchasePropertiesAsync(HStringReference(kItemStoreId).Get(), purchaseProperties.Get(), &purchaseOperation); CheckHr(hr); // Change the following line to call Callback<IAsyncOperationCompletedHandler<StorePurchaseResult*>> if you want the callback to happen back on the UI thread // Implementing FtmBase allows it to fire on the thread the operation finished auto onCompletedCallback = Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StorePurchaseResult*>, FtmBase>>( [](IAsyncOperation<StorePurchaseResult*>* operation, AsyncStatus status) { OnPurchaseOperationDone(operation, status); return S_OK; }); hr = purchaseOperation->put_Completed(onCompletedCallback.Get()); CheckHr(hr); } void OnPurchaseOperationDone(IAsyncOperation<StorePurchaseResult*>* operation, AsyncStatus status) { if (status != AsyncStatus::Completed) { // It failed for some reason. Find out why. ComPtr<IAsyncInfo> asyncInfo; auto hr = operation->QueryInterface(__uuidof(asyncInfo), &asyncInfo); CheckHr(hr); HRESULT errorCode; hr = asyncInfo->get_ErrorCode(&errorCode); CheckHr(hr); // Do something with the errorCode // Return once error is handled return; } ComPtr<IStorePurchaseResult> purchaseResult; auto hr = operation->GetResults(&purchaseResult); CheckHr(hr); StorePurchaseStatus purchaseStatus; hr = purchaseResult->get_Status(&purchaseStatus); CheckHr(hr); switch (purchaseStatus) { case StorePurchaseStatus_Succeeded: case StorePurchaseStatus_AlreadyPurchased: // Success. Product was purchased break; case StorePurchaseStatus_NotPurchased: // User canceled the purchase break; case StorePurchaseStatus_NetworkError: // The device could not reach windows store break; case StorePurchaseStatus_ServerError: // Something broke on the server break; } }

A continuación, le mostramos cómo comprobar si la aplicación está en prueba:

void CheckIsTrial(std::function<void(bool)> onCompleted) { ComPtr<IStoreContextStatics> storeContextStatics; auto hr = RoGetActivationFactory(HStringReference(L"Windows.Services.Store.StoreContext").Get(), __uuidof(storeContextStatics), &storeContextStatics); CheckHr(hr); ComPtr<IStoreContext> storeContext; hr = storeContextStatics->GetDefault(&storeContext); CheckHr(hr); ComPtr<IAsyncOperation<StoreAppLicense*>> getLicenseOperation; hr = storeContext->GetAppLicenseAsync(&getLicenseOperation); CheckHr(hr); hr = getLicenseOperation->put_Completed(Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StoreAppLicense*>, FtmBase>>( [onCompleted{ std::move(onCompleted) }](IAsyncOperation<StoreAppLicense*>* operation, AsyncStatus status) { if (status != AsyncStatus::Completed) { // It failed for some reason. Find out why. ComPtr<IAsyncInfo> asyncInfo; auto hr = operation->QueryInterface(__uuidof(asyncInfo), &asyncInfo); CheckHr(hr); HRESULT errorCode; hr = asyncInfo->get_ErrorCode(&errorCode); CheckHr(hr); // Do something with the errorCode // Return once error is handled return S_OK; } ComPtr<IStoreAppLicense> appLicense; auto hr = operation->GetResults(&appLicense); CheckHr(hr); boolean isActive, isTrial = false; hr = appLicense->get_IsActive(&isActive); CheckHr(hr); if (isActive) { hr = appLicense->get_IsTrial(&isTrial); CheckHr(hr); } onCompleted(static_cast<bool>(isActive)); return S_OK; }).Get()); CheckHr(hr); }

Tengo una aplicación nativa de C ++ / MFC que está desarrollada en VS 2008, nada de .NET, que convertí en una aplicación de UWP utilizando el convertidor de Project Centennial . Así que ahora tengo un paquete .appx que se ejecuta en Windows 10 v 1607 como una aplicación UWP.

Mi próximo objetivo es agregar soporte de compra en la aplicación antes de enviarlo a la Tienda Windows.

La pregunta es, ¿cómo puedo acceder al espacio de nombres de Windows.Services.Store desde una aplicación Win32 pura desde un código C o C ++ nativo?


Vea aquí: https://msdn.microsoft.com/en-us/library/windows/apps/Windows.Services.Store.StoreContext.aspx

Afirma:

Nota: en una aplicación de escritorio de Windows que use Desktop Bridge, debe agregar algún código adicional para configurar el objeto StoreContext antes de que su aplicación pueda usar este objeto. Para obtener más información, vea Usar la clase StoreContext en una aplicación de escritorio que use Desktop Bridge. https://msdn.microsoft.com/windows/uwp/monetize/in-app-purchases-and-trials#desktop


Con los siguientes cambios, esto compilado y funcionó para mí:

1) #include <utility.h>

2) escribe un controlador onCompleted:

void onCompleted(bool bActiveLicense) { // App has active license or not }

3) Cambie la captura de la siguiente manera:

[=, onCompleted{ std::move(onCompleted) }]