C++ 无法在注册表中创建新键

Posted

技术标签:

【中文标题】C++ 无法在注册表中创建新键【英文标题】:C++ cannot create new key in registry 【发布时间】:2011-09-26 05:23:13 【问题描述】:

我真的需要你的帮助。我尝试了一切,但结果总是一样,什么都没有。请指教。

这是我的代码

#include <windows.h>
#include <iostream>
#include <windef.h>

using namespace std;

int main (void)

    HKEY hKey;
    LONG regOpenResult;

    const char PATH[] = "C:\\Users\\les\\Documents\\visual studio 2010\\Projects\\registryTester\\Debug\\registryTester.exe";

    RegCreateKeyExW(HKEY_LOCAL_MACHINE,
            L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
            0,
            NULL,REG_OPTION_VOLATILE,
            KEY_SET_VALUE,
            NULL,
            &hKey,
            NULL
    );

    RegSetValueExW(hKey, L"regTest", 0, REG_SZ, (BYTE*)PATH, strlen(PATH));

    RegCloseKey(hKey);

【问题讨论】:

您能否提供有关您遇到的错误(消息)的任何信息?还请指定您正在使用的操作系统(是 x64 吗)?您的进程是否有足够的权限访问HKEY_LOCAL_MACHINE 谢谢。最后我做到了。您在本地机器上没有权限的应用程序。 【参考方案1】:

您正在使用 RegSetValueEx 的 unicode 版本,但向其传递了一个 char* 字符串。您应该将 PATH 的声明更改为:

const wchar_t PATH[] = L"C:\\Users\\les\\Documents\\visual studio 2010\\Projects\\registryTester\\Debug\\registryTester.exe";

并使用wcslen 而不是strlen,因为它是一个 wchar_t 字符串。由于它以字节(而非字符)为单位,并且需要包含空终止符,因此 size 参数应为 wcslen(PATH)*2+2

【讨论】:

实际上,如果他有VS2008或更高版本,他可能无论如何都默认使用Unicode。当然,PATH 仍然是错误的.. 但是 strlen 和朋友应该可以正常工作。而且他可以使用“RegCreateKeyEx()”代替“RegCreateKeyExW()”等... 编辑:更新为 cbSize 参数以字节(不是字符)为单位测量,并且需要包括空终止符的大小。 wcslen(PATH)*sizeof(wchar_t) + 2 会更清晰、更正确。【参考方案2】:

检查每个 API 调用的返回状态!!!!每次失败使用GetLastError()。

知道错误应该会引导您解决问题。

否则,你会完全失明……

是的,如果您调用 16 位 Unicode API,PATH 不应是 8 位字符串。但这不一定是唯一的问题。

是的,如果您使用的是 Vista、Windows 7 或更高版本,“权限”肯定是个问题。

【讨论】:

以上是关于C++ 无法在注册表中创建新键的主要内容,如果未能解决你的问题,请参考以下文章

无法在 VS 2013 社区中创建 C++ 项目

在JNI中创建新对象

Python:如何禁用在属性字典中创建新键?

在 C++ 中创建新的数据类型

用户注册登录认证模块

使用 C++ 在 Visual Studio 2019 中创建新的头文件?