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