我的 winreg 函数出现错误 2

问题描述

我的代码

HKEY hKey;
char *path = "SYstem\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001\\HwProfileGuid";
LONG result = RegOpenKeyExA(HKEY_LOCAL_MACHINE,path,KEY_ALL_ACCESS,&hKey);
QString q = QString::number(result);

if (result == ERROR_SUCCESS) {
    QMessageBox messageBox1;
    messageBox1.critical(0,"Error","Success");
    messageBox1.setFixedSize(500,200);
} else {
    QMessageBox messageBox2;
    messageBox2.critical(0,q);
    messageBox2.setFixedSize(500,200);
}

我得到的错误

image

密钥在我的注册表中的位置:

image

我认为问题与我将信息放入 path 变量的方式有关,但我不确定。

解决方法

不要将 Computer\\HKEY_LOCAL_MACHINE 传递给字符串。只是 SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001 因为 HKEY_LOCAL_MACHINE 存在于 RegOpenKey 第一个参数中。并且不要试图打开键的值只是键 RegSetKeyValue() 用于写入键的值 这里的工作代码:

HKEY hKey;
LONG result = RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001",KEY_ALL_ACCESS,&hKey);
cout << result << "\n";
,

您将 HwProfileGuid 放在错误的位置。

HwProfileGuid0001 键内的 value,但您试图将 HwProfileGuid 作为 子键打开> 0001 而不是,这就是您收到错误 2 (ERROR_FILE_NOT_FOUND) 的原因,因为没有名为 HwProfileGuid子键

此外,KEY_ALL_ACCESS 的权限太多,无法仅从键中读取值。请改用 KEY_QUERY_VALUE。不要要求比实际需要更多的权利。

试试这个:

const char *path = "SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001";
const char *valueName = "HwProfileGuid";
char guid[40] = {0};

HKEY hKey;
LONG result = RegOpenKeyExA(HKEY_LOCAL_MACHINE,path,KEY_QUERY_VALUE,&hKey);
if (result == ERROR_SUCCESS) {
    DWORD size = sizeof(guid);
    result = RegQueryValueExA(hKey,valueName,NULL,reinterpret_cast<LPBYTE>(guid),&size);
    RegCloseKey(hKey);
}

QMessageBox messageBox;
if (result == ERROR_SUCCESS) {
    messageBox.critical(0,"Success",guid);
} else {
    messageBox.critical(0,"Error",QString::number(result));
}
messageBox.setFixedSize(500,200);

或者,您可以使用 RegGetValueA() 而不是使用 RegOpenKeyExA()+RegQueryValueExA()

const char *path = "SYSTEM\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001";
const char *valueName = "HwProfileGuid";
char guid[40] = {0};
DWORD size = sizeof(guid);
QMessageBox messageBox;

LSTATUS result = RegGetValueA(HKEY_LOCAL_MACHINE,RRF_RT_REG_SZ,guid,&size);
if (result == ERROR_SUCCESS) {
    messageBox.critical(0,200);