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++ 无法在注册表中创建新键的主要内容,如果未能解决你的问题,请参考以下文章