簡體   English   中英

如何在 C++ 中從注冊表中讀取字符串值?

[英]How Read String Value from Registry in 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_USER\Key123鍵,然后調用RegGetValuA()並將其hKey參數設置為該打開鍵,其lpSubKey參數集為"Key123" ,其lpValue參數設置為"name"

因此,您要求RegGetValueA()讀取HKEY_CURRENT_USER\Key123\Key123\name值,但您的意思是讀取HKEY_CURRENT_USER\Key123\name值。 這就是RegGetValueA()ERROR_FILE_NOT_FOUND失敗的原因。

因此,您需要:

  • 使用RegOpenKeyExA()打開HKEY_CURRENT_USER\Key123 ,然后使用RegQueryValueEx() (或帶有lpSubKey=NULLRegGetValueA() )讀取該打開密鑰中的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] == '\0')) { --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); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM