首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中获取OS名称

在C++中获取OS名称
EN

Code Review用户
提问于 2015-10-17 21:48:15
回答 1查看 7K关注 0票数 1

这是我编写的函数,显然用于获取系统名称:

代码语言:javascript
运行
复制
const char* os(){
        OSVERSIONINFO os;
        ZeroMemory(&os, sizeof(OSVERSIONINFO));
        os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&os);
        std::string ret = "Windows ";
        if (os.dwMajorVersion == 10)
                ret += "10";
        else if (os.dwMajorVersion == 6){
                if (os.dwMinorVersion == 3)
                        ret += "8.1";
                else if (os.dwMinorVersion == 2)
                        ret += "8";
                else if (os.dwMinorVersion == 1)
                        ret += "7";
                else
                        ret += "Vista";
        }
        else if (os.dwMajorVersion == 5){
                if (os.dwMinorVersion == 2)
                        ret += "XP SP2";
                else if (os.dwMinorVersion == 1)
                        ret += "XP";
        }
        return ret.c_str();
}

此函数返回指向内存缓冲区的指针,该指针在函数离开时被解除分配(对象在堆中动态分配,而不是在堆栈中分配)。

EN

回答 1

Code Review用户

发布于 2015-10-18 01:50:20

聚合初始化

更喜欢SecureZeroMemory,因为根据MSDN,ZeroMemory可以优化出来。或者更好的是,不要使用奇怪的宏:

代码语言:javascript
运行
复制
OSVERSIONINFO os = {};

无效指针

此函数返回指向内存缓冲区的指针,该指针在函数离开时被解除分配(对象在堆中动态分配,而不是在堆栈中分配)。

对于“这个函数返回一个指向垃圾的指针”来说,这是很多废话。只要返回一个std::string,如果调用方决定要执行c_str(),就让它们执行。

版本号

有些操作系统将有相同的版本号。例如,Windows 8和Windows 2012都是6.2。区分它们的推荐方法是使用OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION (Windows8为true,Windows 2012为false )。一个完整的表可以找到这里

更好的方法?

是的,万能的文件说:

要获得操作系统的完整版本号,请在一个系统DLL(如Kernel32.dll )上调用GetFileVersionInfo函数,然后调用VerQueryValue来获取文件版本信息的\StringFileInfo\ProductVersion子块。

您必须调用函数的顺序是GetFileVersionInfoSizeGetFileVersionInfo,然后是VerQueryValue

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/107898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档