RegCreateKeyEX returns ERROR_INVALID_FUNCTION

RegCreateKeyEX returns ERROR_INVALID_FUNCTION

本文关键字:INVALID FUNCTION ERROR returns RegCreateKeyEX      更新时间:2023-10-16

我正在编写一个需要创建/删除注册表项的程序。我遇到一个问题,创建密钥的代码返回ERROR_INVALID_FUNCTION.

如果您在注册表中查看密钥,则已创建注册表项,因此我不确定此错误的影响是什么。

The value of key is "SOFTWARE\Wow6432Node\COMPANY\APPLICATION"

代码为:

int RegistryViewer::CreateRegistryLocation(const char* key)
{
    HKEY hkey = 0;
    int retVal = RegistryViewer::OpenRegistryLocation(key);
    if(retVal != ERROR_SUCCESS)
    {
        retVal = RegCreateKeyEx(HKEY_LOCAL_MACHINE, CString(key), 0, NULL,REG_OPTION_NON_VOLATILE, KEY_WOW64_32KEY | KEY_WRITE, NULL, &hkey, NULL);
RegCloseKey(hkey);  
}
    return retVal;
}

问题是虽然创建了密钥,但它无法正确设置权限?

谢谢。

将回答我自己的问题,以防将来对其他人有帮助。我想我有两个限制对注册表项的访问的问题,首先我打开了它两次(一次是查看它是否存在,然后在创建时),其次我KEY_WRITE权限分配它。由于RegCreateKeyEx打开一个密钥(如果它已经存在),所以第一次检查毫无意义,并且可能一直在保存资源。我不确定第二件事是一个问题,但由于它在代码中发生了变化,我想我会提到它。

工作代码如下所示:

//Create a registry location
int RegistryViewer::CreateRegistryLocation(const char* key)
{
    HKEY hkey = 0;
    int retVal = RegCreateKeyEx(HKEY_LOCAL_MACHINE, CString(key), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WOW64_32KEY | KEY_ALL_ACCESS, NULL, &hkey, NULL);
    if(retVal == ERROR_SUCCESS)
        RegCloseKey(hkey);
    return retVal;
}

eryksun 的评论对另一个问题很有用,因为我正在手动检查要使用的注册表部分,他使我能够删除该检查。