如何在c++中从注册表中读取字符串值



请有人告诉我怎么了?我复制了此代码并给出错误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);
    }
    

最新更新