我有一个在VS 2008中开发的本机C / MFC应用程序,没有.NET的东西,我使用
Project Centennial converter转换为UWP应用程序.所以现在我有一个.appx包在Windows 10 v 1607中作为UWP应用程序运行.
我的下一个目标是在提交到Windows应用商店之前添加应用内购买支持.
问题是如何从本机C或C代码从纯Win32应用程序访问Windows.Services.Store命名空间?
使用WRL.以下是有关如何购买应用内购买的示例:
#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; } }
以下是检查应用程序是否正在试用的方法:
void CheckIsTrial(std::function<void(bool)> onCompleted) { ComPtr<IStoreContextStatics> storeContextStatics; auto hr = RoGetActivationFactory(HStringReference(L"Windows.Services.Store.StoreContext").Get(),&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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。