确定C ++应用程序是否作为UWP应用程序运行,具有旧版支持

问题描述 投票:1回答:3

我的第一个想法是使用GetPackageFamilyName()并寻找ERROR_SUCCESS vs APPMODEL_ERROR_NO_PACKAGE

但是,我需要支持Windows 7,这使得GetPackageFamilyName()无法使用。

有没有一个像样的替代方法?也许在注册表中的任何东西?

c++ winapi uwp desktop-bridge project-centennial
3个回答
5
投票

使用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来调用进程。


2
投票

GetPackageFamilyName是正确的方法。为了支持Windows 7,您可以先检查您是否在Win7上运行。如果你是,那么你知道你没有打包。仅当您使用的版本> 7时,才调用GetPackageFamilyName来检查是否已打包。


0
投票

以下是Microsoft的一篇文章,其中也应该支持Windows 7。

Desktop Bridge – Identify the application’s context

© www.soinside.com 2019 - 2024. All rights reserved.