我有一个在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);
}