RegOpenKeyEx找不到现有值



我正在检查值"XXS"存在于运行注册表

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\XXS", 0, KEY_READ | KEY_WOW64_64KEY, &hkey) == ERROR_FILE_NOT_FOUND)
{
std::cout << "KEY NOT FOUND";
LONG createStatus = RegCreateKey(HKEY_CURRENT_USER, L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", &hkey); //Creates a key       
LONG status = RegSetValueEx(hkey, L"XXS", 0, REG_SZ, (LPBYTE)path, (size + 1) * sizeof(WCHAR));
}

我不知道为什么会发生这种情况,如果我使用这个函数正确。钥匙确实存在,但它说它不存在。该程序是64位运行在64位pc

我认为这里的问题是你没有区分键和值。

注册表项是类似文件夹的容器对象。注册表值是非容器对象,类似于文件。键可以包含值和子键

所以你基本上需要打开/创建一个键,然后处理其中的值

在你的情况下,我会尝试这样做(但要注意,从我的头顶,未测试):

#define HKLM_BASE L"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
HKEY  hKey;
wchar_t buf[256] = { 0 };
LONG  regError = RegOpenKeyEx(HKEY_LOCAL_MACHINE,HKLM_BASE,0, KEY_WOW64_64KEY | KEY_ALL_ACCESS,&hKey);
if (regError == ERROR_SUCCESS)
{
DWORD dwDataSize = sizeof(buf);
regError   = RegQueryValueEx(hKey,L"XXS", NULL, NULL,(LPBYTE)&buf,&dwDataSize);
if ((regError != ERROR_SUCCESS) )
{
wchar_t *path  =L"your value";
if (ERROR_SUCCESS != RegSetValueEx(hKey,L"XXS",NULL,REG_SZ,((const BYTE*)&path),wcslen (path)))
{
/* handle error */
}
} else {
/* current value in buf */
}
RegFlushKey( hKey );
RegCloseKey( hKey );
} else {
/* handle error */
}

欢迎使用堆栈溢出!当我打字的时候,我发现吗啡只是快一点。但他忘记解释他所做的大部分改变。这是我的2美分。吗啡的例子很好,我就不多举了。

我认为XXS是一个值(因为你创建了一个值,而不是一个键,如果它不存在)。这意味着您需要在打开注册表项后检查该值是否存在。我还建议您检查从RegOpenKeyEx函数返回的任何错误,而不仅仅是ERROR_FILE_NOT_FOUND错误。

我建议的另一件事是使用RegCreateKeyEx而不是RegCreateKey,这是因为文档中说:

备注该函数仅兼容16位Windows版本。应用程序应该使用RegCreateKeyEx函数。但是,备份或恢复系统状态的应用程序包括系统文件和注册表应该使用卷影复制服务而不是注册表函数

最后但并非最不重要的是,当你不再需要钥匙时,不要忘记关上它们。你不需要关闭值

最新更新