2014-02-11 92 views
0

我正在编写一个库,我想在各种平台的程序中使用它。下面是我如何检测不同版本的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应设置为桌面任何x86程序,PC_APP在x86 Windows应用商店的应用程序,所以我检查PC_APP桌面前。然后,针对Windows 8 Phone应用程序的PHONE_APP和针对所有应用程序定义的APP,因此我假设其他人都没有成功,我们必须为WinRT应用程序做准备。它是否正确?另外,我相信这个头文件只包含在MSVC的最新版本中,在默认Win32检查之前我应该​​使用什么截点? 2011年之前的事情够好吗?

回答

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 Store应用程序)都具有相同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