【问题标题】:RegCreateKeyEX returns ERROR_INVALID_FUNCTIONRegCreateKeyEX 返回 ERROR_INVALID_FUNCTION
【发布时间】:2015-05-11 23:37:54
【问题描述】:

我正在编写一个需要创建/删除注册表项的程序。我遇到了一个问题,即创建密钥的代码返回 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,但是无法正确设置权限?

谢谢。

【问题讨论】:

  • 我不知道为什么它会因特定错误而失败,但我怀疑它无论如何都会做你想做的事。当您指定KEY_WOW64_32KEY 时,不要明确引用“Wow6432Node”。重定向是自动的。只需使用"SOFTWARE\\COMPANY\\APPLICATION"

标签: c++ windows error-handling registry


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多