请有人告诉我怎么了?我复制了此代码并给出错误error_FILE_NOT_FOUND注册表中有一个字符串值,名称为";name";
string GetRegistry()
{
DWORD dwType = REG_SZ;
HKEY Handler = 0;
string subkey = "Key123\";
string value_name = "name";
DWORD AnswerType;
char data[32];
DWORD buffer_size = 32;
LSTATUS Answer = RegOpenKeyA(HKEY_CURRENT_USER, subkey.c_str(), &Handler);
if (Answer != ERROR_SUCCESS) {
return "Faild To Open Registry Key";
}
Answer=RegGetValueA(Handler, subkey.c_str(), value_name.c_str(), RRF_RT_REG_SZ, &AnswerType, data, &buffer_size);
RegCloseKey(Handler);
string return_data = "";
for (unsigned int a = 0; a < 32; a++) {
return_data += (char)*(data + a);
}
return return_data;
}
您滥用了RegGetValueA()
。
其lpValue
参数相对于其lpSubKey
参数,后者相对于其hkey
参数。
您正在使用RegOpenKeyA()
(已弃用,应改为使用RegOpenKeyExA()
)打开HKEY_CURRENT_USERKey123
密钥,然后调用RegGetValuA()
,其hKey
参数设置为该打开密钥,lpSubKey
参数设置为"Key123"
,lpValue
参数设置为"name"
。
因此,您要求RegGetValueA()
读取HKEY_CURRENT_USERKey123Key123name
值,但您的意思是读取HKEY_CURRENT_USERKey123name
值。这就是RegGetValueA()
与ERROR_FILE_NOT_FOUND
一起失败的原因。
所以,你需要:
-
使用
RegOpenKeyExA()
打开HKEY_CURRENT_USERKey123
,然后使用RegQueryValueEx()
(或RegGetValueA()
与lpSubKey=NULL
)读取该打开密钥中的name
值,例如:string GetRegistry() { HKEY Handler = NULL; string subkey = "Key123"; string value_name = "name"; char data[32]; DWORD buffer_size = 32; LSTATUS Answer = RegOpenKeyExA(HKEY_CURRENT_USER, subkey.c_str(), 0, KEY_QUERY_VALUE, &Handler); if (Answer != ERROR_SUCCESS) { return "Failed To Open Registry Key"; } Answer = RegQueryValueExA(Handler, value_name.c_str(), NULL, NULL, (LPBYTE)data, &buffer_size); RegCloseKey(Handler); if (Answer != ERROR_SUCCESS) { return "Failed To Read Registry Value"; } // the data MAY or MAY NOT be null-terminated, // ignore the terminator if it is present... if ((buffer_size > 0) && (data[buffer_size-1] == ' ')) { --buffer_size; } return string(data, buffer_size); }
string GetRegistry() { HKEY Handler = NULL; string subkey = "Key123"; string value_name = "name"; char data[32]; DWORD buffer_size = 32; LSTATUS Answer = RegOpenKeyExA(HKEY_CURRENT_USER, subkey.c_str(), 0, KEY_QUERY_VALUE, &Handler); if (Answer != ERROR_SUCCESS) { return "Failed To Open Registry Key"; } Answer = RegGetValueA(Handler, NULL, value_name.c_str(), RRF_RT_REG_SZ, NULL, data, &buffer_size); RegCloseKey(Handler); if (Answer != ERROR_SUCCESS) { return "Failed To Read Registry Value"; } // the data IS null-terminated, ignore the terminator... return string(data, buffer_size-1); }
-
单独使用
RegGetValueA()
,完全不使用RegOpenKeyExA()
,例如:string GetRegistry() { HKEY Handler = NULL; string subkey = "Key123"; string value_name = "name"; char data[32]; DWORD buffer_size = 32; LSTATUS Answer = RegGetValueA(HKEY_CURRENT_USER, subkey.c_str(), value_name.c_str(), RRF_RT_REG_SZ, NULL, data, &buffer_size); if (Answer != ERROR_SUCCESS) { return "Failed To Read Registry Key Value"; } // the data is null-terminated, ignore the terminator... return string(data, buffer_size-1); }