Преобразование DriverVersion в человекочитаемый формат

Я искал все выше и ниже, не смог найти никакой документации, я могу получить DriverVersion, как описано здесь. Создание и перечисление дисков устройства работает, поэтому нет необходимости искать там. DriverVersion является типом "DWORDLONG". Мне нужно преобразовать это в удобочитаемый формат, например, 20.xx.xx.xx. Там нет никакой документации на MSDN или где-либо я искал.

Любая помощь будет оценена.

Пример значения "DriverVersion": 1688863374327808

Фрагмент кода, если он вообще необходим,

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;
                            }
                        }
                     }
                } 

2 ответа

Решение

Вы могли бы использовать 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();

Следуя вашему коду и избавиться от буста просто сделайте:

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;

Если кого-то интересует реализация Golang, вот вам.

      highPart := uint32(drvInfo.DriverVersion >> 32)
lowPart := uint32(drvInfo.DriverVersion & 0xffffffff)
versionStr := fmt.Sprintf("%d.%d.%d.%d",
    uint16(highPart>>16),
    uint16(highPart),
    uint16(lowPart>>16),
    uint16(lowPart))
fmt.Printf("Version: %s\n", versionStr)
Другие вопросы по тегам