[英]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=NULL
的RegGetValueA()
)讀取該打開密鑰中的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.