【问题标题】:Preprocessor definitions for Universal Windows Platform?通用 Windows 平台的预处理器定义?
【发布时间】:2016-07-04 11:56:33
【问题描述】:

我们有一个 C++ 库,我们收到了一些支持 UWP 的请求。我现在正在调查港口。我正在查看 Microsoft 针对 Visual Studio 2015 的 C/C++ Preprocessor Reference | Predefined Macros,但没有看到任何与 UWP 相关的内容。

我找到了How to: Use Existing C++ Code in a Universal Windows Platform App,但它们看起来像那些 Metro UI 应用程序的旧定义:

  • WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
  • WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
  • WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
  • WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

我希望看到特定于最新版本的 Windows 运行时的内容。我认为我们或许能够通过_WIN32_WINNT_WIN10 检测到Windows 10 和UWP,但如果我正确解析来自MSDN 的Using the Windows Headers不会 出现这样的宏。

还有some APIs are only available for Windows 10 and UWP Windows Store apps,因此我们需要检测何时缺少某些 API(即 Windows Phone 8、Windows Store 8、Windows 10 和 Windows Store 10)。

用于检测 UWP 的预处理器宏有哪些?


一个相关的问题可能是Detect Windows Kit 8.0 and Windows Kit 8.1 SDKs,但我目前不确定。

【问题讨论】:

    标签: visual-studio visual-c++ windows-store-apps win-universal-app c-preprocessor


    【解决方案1】:

    您提到的宏可能可以追溯到 Windows 8,但添加了一些用于服务器应用和驱动程序的宏,它们仍然是用于通用 Windows 应用的宏。

    请注意,没有预定义的宏内置于特定于 UWP 的 Visual C++ 编译器中。 UWP 风格的所有宏都在 Windows 10 SDK 附带的 winapifamily.h 标头中定义。您可以在作为 SDK 一部分安装的共享包含文件目录中找到它,例如,C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\shared\winapifamily.h,以您的安装驱动器和 SDK 版本为模。

    winapifamily.h 中的 cmets 非常广泛,并且很好地描述了这些宏所需的每个用例。您可以将它们用于条件编译,或通过在函数声明上使用 _WINAPI_DEPRECATED_DECLARATION 为不兼容 UWP 的代码设置弃用警告。

    编辑以添加示例:

    在包含 winapifamily.h 之后的代码中,您可以打开在特定版本的 Windows SDK 中定义的宏来执行特定于该版本的操作,如下所示:

    #include <winapifamily.h>
        // ...
    #if defined (WINAPI_FAMILY_SYSTEM)
        // WINAPI_FAMILY_SYSTEM is new to Windows 10, so do Windows 10-specific
        // calls here
    #elif (WINAPI_PARTITION_APP == 1)
        // This value is forced to 1 in Windows 8.1, but it's different in
        // Windows 8.0 so make Windows 8.1-specific calls here
    #else
        // Make Windows 8.0-specific calls here
    #endif
    

    这只是一种(未经我测试)根据读取标头中的内容来制作特定于 SDK 版本的代码的方法。这与编译器版本(在_MSC_VER_MSC_VER_FULL 中定义)或平台NTDDI_* 值无关。

    【讨论】:

    • 好的,编辑很好(不幸的是,我不能再次投票)。 Windows Phone 8 和 Windows Store 8 上缺乏 Bcrypt/CNG 使这个问题成为一个需要可靠解决方案的问题,我认为你的观察会很好地工作。和另一个问题一样,我需要一些时间来测试它。我正在开发一个 SSE2->NEON 端口,所以我需要继续使用它而不是中断这个测试。给我一两个星期的时间来测试它。
    • 确保您的成品也通过了 WACK——创建一个虚拟商店项目,包含您的库,然后选择创建商店包并运行 App Compat 测试。您实际上不必向商店提交任何内容来验证这一点。
    • 这可能是相关的:What is WINAPI_FAMILY_ONECORE_APP?
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 2013-09-11
    • 1970-01-01
    • 2020-10-12
    • 2011-02-28
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多