c++ - RegOpenKeyEx 和 RegSetValueEx 失败,但我不知道为什么

标签 c++ windows winapi registry rights

作为新手 C++ 程序员,我想在 Windows 注册表中设置一个值。我创建了这个教科书实现来完成这个,但我总是得到错误 998。我想我错过了一些非常简单明了的东西,但我不知道它是什么。

以普通用户或管理员身份运行此代码没有任何区别。

#define LEDPORT 3
#define SUBKEY "SOFTWARE\\PATH\\OTHERPATH\\"

    HKEY key;
    if(RegCreateKey(HKEY_LOCAL_MACHINE,  TEXT(SUBKEY), &key) == ERROR_SUCCESS)
    {
        HKEY createKey;
        DWORD value = LEDPORT;

        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(SUBKEY), NULL, KEY_ALL_ACCESS, &createKey) == ERROR_SUCCESS){

            // retVal returns error 998 and the value isn't set
            int retVal = RegSetValueEx(createKey, TEXT("PortNumber"), NULL, REG_DWORD, (BYTE *)value, sizeof(value));


            RegCloseKey(createKey);
        }
    }

实际上,这会在 LocalMachine\Software\Path\OtherPath 中创建提到的键,但 DWORD 值“PortNumber”不是。

同样,我认为这很简单,但我花了几个小时思考它可能是什么,但我想不出来。

最佳答案

转换为人类可读的错误代码 998 是 对内存位置的无效访问。 原因是您的转换 (BYTE*)value,重新解释值 3 (LEDPORT) 作为一个地址。 (BYTE*)&value 解决了您眼前的问题。

关于c++ - RegOpenKeyEx 和 RegSetValueEx 失败,但我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23007307/

相关文章:

c# - 传递信息并从另一个线程通知一个线程的最简单方法

c++ - 用于在 C++ 中存储非常大的二维数据的数据结构

java - 如何找到包含类定义的jar文件?

windows - 将上下文菜单添加到 Windows 资源管理器以运行 BAT 文件

java - 设计模式 : Elements of Reusable Object-Oriented Software

windows - 未登录服务器时,脚本中的 Get-Service 不起作用

c# - 如何将 native 窗口处理程序 (HWND) 嵌入到 C# WPF 应用程序中

C++ CTRL+C 处理程序具有未定义的行为?

c++ - 将 (const) char * 转换为 LPCWSTR

c++ - 如何在另一个类的方法中使用一个类的实例?