Определите, работает ли приложение C ++ как приложение UWP, с устаревшей поддержкой - PullRequest
0 голосов
/ 06 сентября 2018

Моей первой мыслью было использовать GetPackageFamilyName() и искать ERROR_SUCCESS против APPMODEL_ERROR_NO_PACKAGE.

Но мне нужна поддержка Windows 7, что делает GetPackageFamilyName() непригодным для использования.

Есть ли достойный альтернативный метод? Что-нибудь в реестре, возможно?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Используйте 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 для вызывающего процесса.

0 голосов
/ 07 сентября 2018

Вот статья от Microsoft с примером, который также должен поддерживать Windows 7.

Desktop Bridge - определение контекста приложения

0 голосов
/ 06 сентября 2018

GetPackageFamilyName - правильный путь. Для поддержки Windows 7 вы можете сначала проверить, работаете ли вы на Win7. Если да, то вы знаете, что не упакованы. Только если у вас версия> 7, вы вызываете GetPackageFamilyName, чтобы проверить, упакованы ли вы.

...