diff --git a/src/corelib/kernel/qfunctions_win.cpp b/src/corelib/kernel/qfunctions_win.cpp index ca72c395a9a..ed0e25467c2 100644 --- a/src/corelib/kernel/qfunctions_win.cpp +++ b/src/corelib/kernel/qfunctions_win.cpp @@ -3,9 +3,16 @@ #include "qfunctions_win_p.h" +#include + #include #include +#if __has_include() +# include +# define HAS_APPMODEL +#endif + QT_BEGIN_NAMESPACE QComHelper::QComHelper(COINIT concurrencyModel) @@ -25,4 +32,33 @@ QComHelper::~QComHelper() CoUninitialize(); } +/*! + Checks if the application has a \e{package identity} + + Having a \e{package identity} is required to use many modern + Windows APIs. + + https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/modernize-packaged-apps +*/ +bool qt_win_hasPackageIdentity() +{ +#if defined(HAS_APPMODEL) + static const bool hasPackageIdentity = []() { + UINT32 length = 0; + switch (const auto result = GetCurrentPackageFullName(&length, nullptr)) { + case ERROR_INSUFFICIENT_BUFFER: + return true; + case APPMODEL_ERROR_NO_PACKAGE: + return false; + default: + qWarning("Failed to resolve package identity (error code %ld)", result); + return false; + } + }(); + return hasPackageIdentity; +#else + return false; +#endif +} + QT_END_NAMESPACE diff --git a/src/corelib/kernel/qfunctions_win_p.h b/src/corelib/kernel/qfunctions_win_p.h index 46c4bfa9fee..540405bd2f7 100644 --- a/src/corelib/kernel/qfunctions_win_p.h +++ b/src/corelib/kernel/qfunctions_win_p.h @@ -17,7 +17,7 @@ #include -#if defined(Q_OS_WIN) +#if defined(Q_OS_WIN) || defined(Q_QDOC) #if !defined(QT_BOOTSTRAPPED) #include @@ -41,6 +41,8 @@ private: HRESULT m_initResult = E_FAIL; }; +Q_CORE_EXPORT bool qt_win_hasPackageIdentity(); + QT_END_NAMESPACE #endif // Q_OS_WIN