RegCreateKeyEX返回ERROR_INVALID_FUNCTION

时间:2015-03-10 13:39:44

标签: c++ windows error-handling registry

我正在编写一个需要创建/删除注册表项的程序。我遇到的问题是创建密钥的代码返回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;
}

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

感谢。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,以防将来对别人有帮助。我认为我有两个限制访问注册表项的问题,首先我打开它两次(一次看它存在然后创建时),其次我分配了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的评论对另一个问题很有用,因为我手动检查要使用的注册表部分,并且他允许我删除该支票。