读取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);