我正在编写一个我想在各种平台的程序中使用的库。以下是我检测不同版本Windows的方法:
#if defined(_MSC_VER)
#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
// Windows PC Store App
#define OS_WINDOWS_STORE
#endif
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
// Windows Desktop App
#define OS_WINDOWS
#endif
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
// Windows Phone App
#define OS_WINDOWS_PHONE
#endif
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
// Windows RT Store App
#define OS_WINDOWS_RT
#endif
#elif defined(_WIN32_) || defined(_WIN32)
// Windows Desktop App
#define OS_WINDOWS
#endif
我的理解是WINAPI_FAMILY_PARTITION应该设置为DESKTOP用于任何x86程序,PC_APP用于windows存储应用程序在x86上,所以我在DESKTOP之前检查PC_APP。然后,PHONE_APP用于Windows 8 Phone应用程序,并且APP是为所有内容定义的,因此我假设如果没有其他成功,我们必须使用WinRT应用程序。它是否正确?另外,我相信这个标题只包含在MSVC的最新版本中,在默认为Win32检查之前我应该使用的截止点是什么? 2011年之前的任何事情都足够好吗?
答案 0 :(得分:0)
根据您想要区分这些问题的原因,有比您的方法更好的方法来解决这个问题。例如。如果您想知道可以访问哪种API,则应该使用推荐的方法,并在代码中的适当位置检查WINAPI_FAMILY_PARTITION
。
如果您想使用您的方法,则存在许多问题。首先,你有#ifdefs不匹配。其次,WINAPI_PARTITION_APP
是不推荐使用的常量,与WINAPI_FAMILY_PC_APP
相同。第三,如果你真的想要识别Windows RT版本,则需要检查CPU,而不是WINAPI_FAMILY
,因为Windows RT(即ARM上的Windows 8.1)和Windows 8.1 Store(即x86或x86-64上的Windows应用商店应用)两者都有相同的API。
#if defined(_MSC_VER)
#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
#if _M_ARM
// Windows RT Store App
#define OS_WINDOWS_RT
#else
// Windows PC Store App
#define OS_WINDOWS_STORE
#endif
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
// Windows Desktop App
#define OS_WINDOWS
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
// Windows Phone App
#define OS_WINDOWS_PHONE
#endif
#elif defined(_WIN32_) || defined(_WIN32)
// Windows Desktop App
#define OS_WINDOWS
#endif