Преобразование 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;
                            }
                        }
                     }
                } 

person Suraj S    schedule 13.02.2018    source источник


Ответы (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();

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

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;
person Wum    schedule 13.02.2018
comment
Все еще не тестировал это, но нельзя ли это сделать изначально без использования каких-либо других библиотек, таких как boost? - person Suraj S; 13.02.2018
comment
Да, конечно. Есть много способов преобразовать числа в строки, например. std::stringstream или std::to_string: cplusplus.com/articles/D9j2Nwbp - person Wum; 13.02.2018
comment
Потрясающий! Работает так, как ожидалось. Можете ли вы объяснить логику того, как эти строки версии кодируются в DWORDLONG? @Вум - person Suraj S; 14.02.2018
comment
ULARGE_INTEGER — это объединение, представляющее 64-битное целое число без знака. Вы присваиваете ему SP_DRVINFO_DATA.DriverVersion, который также является 64-битным целым числом без знака. Используя макросы HIWORD/LOWORD, вы извлекаете старшее/младшее слово 32-битных элементов данных ULARGE_INTEGER.HighPart и ULARGE_INTEGER.LowPart вашего ULARGE_INTEGER. - person Wum; 14.02.2018
comment
Большое спасибо!, это помогло - person Suraj S; 14.02.2018