下面以获取intel显卡(Intel(R) UHD Graphics 630)驱动版本为例进行说明:
1.首先下在任务管理中获取到对应设备的class id。如下图
2.打开对应的注册表
string strVer="";
HKEY hKey = NULL;
if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}", 0, KEY_READ , &hKey) == ERROR_SUCCESS)
{
WriteLogE("OPen Regedit Err!");
return "";
}
3.获取子节点个数:
char szClassname[255];//类名
DWORD dwClassnameLength;//装载类名缓冲区的长度
DWORD dwsubsum;//保存这个项的子项数量
DWORD dwMaxSubKeyLen;//装载这个项最长一个子项的长度
DWORD dwMaxClassLen;//装载这个项之子项的最长一个类名的长度
DWORD dwValues;//用于装载这个项的设置值数量的一个变量
DWORD dwMaxValueNameLen;//装载这个项之子项的最长一个值名的长度
DWORD dwMaxValueLen;//装载容下这个项最长一个值数据所需的缓冲区长度
DWORD dwSecurityDescriptor;//装载值安全描述符长度的一个变量
FILETIME strftLastWriteTime;//指定一个结构,用于容纳该项的上一次修改时间
// 获取类名和数量
DWORD dwret = RegQueryInfoKeyA(
hKey, // 键的句柄
szClassname, // 类名
&dwClassnameLength, // 类名长度
NULL, // 保留
&dwsubsum, // 子键的数量
&dwMaxSubKeyLen, // 子键长度
&dwMaxClassLen, // 类长度
&dwValues, // 子键键值数量
&dwMaxValueNameLen, // 子键名长度
&dwMaxValueLen, // 键值长度
&dwSecurityDescriptor, // 安全描述符
&strftLastWriteTime); // 最后写时间
4.循环遍历查找所有子节点的DriverDesc的值是否包含“Graphics 630”,若包含再获取DrivrVersion的键值就是对应的版本号
5.需要用RegCloseKey关闭所有打开的注册表句柄。
char szKeyvalue[255];
DWORD dwKeyvalueLen;
if (dwsubsum != 0)
{
for (int i = 0; i < dwsubsum; i++)
{
memset(szKeyvalue, 0, sizeof(szKeyvalue));
dwKeyvalueLen = 255;
dwret = RegEnumKeyExA(
hKey,
i,//欲获取的子项的索引。第一个子项的索引编号为零
szKeyvalue,//用于装载指定索引处项名的一个缓冲区
&dwKeyvalueLen, //装载szKeyvalue的实际长度
NULL,
NULL,
NULL,
&strftLastWriteTime);
if (dwret == ERROR_SUCCESS)
{
HKEY hSubKey;
LSTATUS lRet = RegOpenKeyExA(hKey, szKeyvalue, 0L, KEY_QUERY_VALUE, &hSubKey);
DWORD dwType = 1;//定义数据类型
DWORD dwLen = MAX_PATH;
char data[MAX_PATH];
if (ERROR_SUCCESS == lRet)
{
if (ERROR_SUCCESS == RegQueryValueExA(hSubKey, "DriverDesc", NULL, &dwType, (LPBYTE)data, &dwLen))
{
if (strstr(data, "Graphics 630"))
{
if (ERROR_SUCCESS == RegQueryValueExA(hSubKey, "DriverVersion", NULL, &dwType, (LPBYTE)data, &dwLen))
{
strVer = data;
RegCloseKey(hSubKey);
break;
}
}
}
}
RegCloseKey(hSubKey);
}
}
}