Моей первой мыслью было использовать GetPackageFamilyName()
и искать ERROR_SUCCESS
против APPMODEL_ERROR_NO_PACKAGE
,
Но мне нужно поддерживать Windows 7, которая делает GetPackageFamilyName()
непригодным для использования.
Есть ли достойный альтернативный метод? Что-нибудь в реестре, возможно?
использование GetProcAddress()
загрузить GetPackageFamilyName()
динамически во время выполнения, например:
typedef LONG WINAPI (*LPFN_GPFN)(HANDLE, UINT32*, PWSTR);
bool bIsUWP = false;
LPFN_GPFN lpGetPackageFamilyName = (LPFN_GPFN) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "GetPackageFamilyName");
if (lpGetPackageFamilyName)
{
UINT32 size = 0;
if (lpGetPackageFamilyName(GetCurrentProcess(), &size, NULL) == ERROR_INSUFFICIENT_BUFFER)
bIsUWP = true;
}
if (bIsUWP)
{
//...
}
else
{
//...
}
В качестве альтернативы рассмотрите возможность использования одного из GetCurentPackage...()
функции (GetCurrentPackageFamilyName()
, GetCurrentPackageId()
, GetCurrentPackageInfo()
, и т. д.) вместо использования GetPackageFamilyName()
с HANDLE
в процессе вызова.
GetPackageFamilyName — правильный путь. Для поддержки Windows 7 вы можете сначала проверить, работаете ли вы на Win7. Если да, то вы знаете, что не упакованы. Только если у вас версия> 7, вы вызываете GetPackageFamilyName, чтобы проверить, упакованы ли вы.
Вот статья от Microsoft с примером, который также должен поддерживать Windows 7.