【问题标题】:Converting DriverVersion to Human readable format将 DriverVersion 转换为人类可读的格式
【发布时间】:2018-02-13 13:44:24
【问题描述】:

我已经搜索了它的高低,找不到任何文档,我能够得到 DriverVersion,如Here 所述。创建和枚举设备驱动器正在工作,因此无需查看那里。 DriverVersion 是一种“DWORDLONG”。我需要将其转换为人类可读的格式,如 20.xx.xx.xx。 MSDN 上或我搜索过的任何地方都没有任何文档。

任何帮助将不胜感激。

“DriverVersion”的示例值:1688863374327808

代码 sn-p,如果需要的话,

SP_DEVINFO_DATA devInfo;
                devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
                if (SetupDiEnumDeviceInfo(handle, 0, &devInfo))
                {   
                    if(SetupDiBuildDriverInfoList(handle,&devInfo,SPDIT_COMPATDRIVER))
                     {
                         SP_DRVINFO_DATA drvInfo;
                        drvInfo.cbSize = sizeof(SP_DRVINFO_DATA);
                            int i=0;
                        while(1)
                        {
                            try
                            {
                                if (SetupDiEnumDriverInfo(handle, &devInfo, SPDIT_COMPATDRIVER, i++, &drvInfo))
                                {
                                    cout<<"Version :"<<drvInfo.DriverVersion<<endl; // Need Human Readable version here.
                                }
                                else
                                    break;
                            }
                            catch(std::exception ex)
                            {
                                break;
                            }
                        }
                     }
                } 

【问题讨论】:

    标签: c++ winapi setupapi


    【解决方案1】:

    您可以使用 ULARGE_INTEGER 联合、HIWORD/LOWORD 宏和字符串格式化工具(如 boost::format)来执行以下操作(未经测试的代码):

    SP_DRVINFO_DATA driverInfoData;
    ULARGE_INTEGER version;
    
    version.QuadPart = driverInfoData.DriverVersion;
    
    std::string versionStr = (boost::format("%s.%s.%s.%s")
        % HIWORD(version.HighPart)
        % LOWORD(version.HighPart)
        % HIWORD(version.LowPart)
        % LOWORD(version.LowPart)).str();
    

    按照您的代码并摆脱 boost 只需执行以下操作:

    std::cout << "Version: "
              << std::to_string(HIWORD(version.HighPart)) << "."
              << std::to_string(LOWORD(version.HighPart)) << "."
              << std::to_string(HIWORD(version.LowPart)) << "."
              << std::to_string(LOWORD(version.LowPart)) << std::endl;
    

    【讨论】:

    • 还没有测试,但是如果不使用boost之类的任何其他库就不能原生完成吗?
    • 是的,当然。有很多方法可以将数字转换为字符串,例如std::stringstream 或 std::to_string: cplusplus.com/articles/D9j2Nwbp
    • 太棒了!按预期工作,您能否解释这些版本字符串如何编码为 DWORDLONG 的逻辑? @Wum
    • ULARGE_INTEGER 是一个联合,表示一个 64 位无符号整数值。您将 SP_DRVINFO_DATA.DriverVersion 分配给它,它也是一个 64 位无符号整数。使用宏HIWORD/LOWORD 检索ULARGE_INTEGER 的32 位数据成员ULARGE_INTEGER.HighPart 和ULARGE_INTEGER.LowPart 的高位/低位字。
    • 非常感谢!,这有帮助
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2021-06-21
    • 2010-12-11
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2017-06-07
    • 2014-07-26
    相关资源
    最近更新 更多