WindowsAPI 读取Windows注册表信息

读取Windows注册表信息一般会用到3个函数。

1.RegOpenKeyExW()

LSTATUS RegOpenKeyExW(
  HKEY    hKey,      //主键或打开注册表项的句柄
  LPCWSTR lpSubKey,  //要打开的注册表子键的名称 如:L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"
  DWORD   ulOptions, //一般为0
  REGSAM  samDesired,//打开的键的所需访问权限
  PHKEY   phkResult  //接收已打开键的句柄的变量的指针
);
如果函数成功,则返回值为ERROR_SUCCESS。

如果函数失败,则返回值是Winerror.h中定义的非零错误代码。可以将FormatMessage函数与FORMAT_MESSAGE_FROM_SYSTEM标志一起使用, 以获取错误的一般描述。

 

2.RegQueryValueExW()

LSTATUS RegQueryValueExW(
  HKEY    hKey,       //主键或打开注册表项的句柄
  LPCWSTR lpValueName,//键值的名称
  LPDWORD lpReserved, //此参数是保留的,必须为NULL
  LPDWORD lpType,     //指向键值相同数据类型的指针
  LPBYTE  lpData,     //指向接收键值数据的缓冲区的指针(注意需强制类型转换为LPBYTE)
  LPDWORD lpcbData    //指向变量的指针,该变量指定lpData参数指向的缓冲区大小。函数返回时,此变量包含复制到lpData的数据的大小。
);
如果函数成功,则返回值为ERROR_SUCCESS。

如果函数失败,则返回值是系统错误代码。

如果lpData缓冲区太小而无法接收数据,则该函数返回ERROR_MORE_DATA。

如果lpValueName注册表值不存在,则该函数返回ERROR_FILE_NOT_FOUND。

 

3.RegCloseKey()

LSTATUS RegCloseKey(
  HKEY hKey         //要关闭的打开键的句柄
);
如果函数成功,则返回值为ERROR_SUCCESS

 

具体示例如下:

	BOOL			result;
	HKEY			hkey;
	LSTATUS			reg_return;
	DWORD			data_type_dword;
	DWORD			data_size;

	data_size = sizeof(MaidInfo.cpu_frequency);

	reg_return = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ | KEY_WOW64_64KEY, &hkey);
	if (reg_return != ERROR_SUCCESS)
	{
		printf("cpu_frequency open faild. return is %d\n", reg_return);
	}

	reg_return = RegQueryValueExW(hkey, L"~MHz", NULL, &data_type_dword, (LPBYTE)& MaidInfo.cpu_frequency, &data_size);
	if (reg_return != ERROR_SUCCESS)
	{
		printf("cpu_frequency query value faild. return is %d\n", reg_return);
	}

	printf("cpu_frequency: %u\n", MaidInfo.cpu_frequency);
	printf("data_size: %u\n\n", data_size);

	RegCloseKey(hkey);