gpt4 book ai didi

C++ REG_SZ 加值失败

转载 作者:行者123 更新时间:2023-11-28 03:27:50 24 4
gpt4 key购买 nike

此代码的目的是添加或编辑 KeyboardDelay REG_SZ 的值。我能做的是将它的值设置为 0,但是当我尝试将它设置为 31 时,它失败了,并且出现一个奇怪的“框”作为 KeyboardDelays 数据值而不是数字 31。我做错了什么因为它不会添加 31 但它会做 0 吗?

HKEY key;
if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Control Panel\\Keyboard"), &key) != ERROR_SUCCESS)
{
cout << "Unable to open registry key";
}

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)"31", strlen("31")*sizeof(char)) != ERROR_SUCCESS)
{
RegCloseKey(key);
cout <<"Unable to set registry value value_name";
}
else
{
cout << "KeyboardDelay was set" << endl;
}

最佳答案

RegSetValueEx在winreg.h中定义如下:

#ifdef UNICODE
#define RegSetValueEx RegSetValueExW
#else
#define RegSetValueEx RegSetValueExA
#endif // !UNICODE

这意味着当定义 UNICODE 时,将使用 RegSetValueExW。最后一个字母'W'表示它接受宽字符串(wchar_t*),'A'表示它接受多字节字符串。因此,如果您知道您正在使用启用的 UNICODE 进行编译(项目属性 -> 配置 -> 字符集 -> 使用 Unicode 字符集),则应该提供宽字符串文字。 windows下最简单的方法就是使用宏:

TEXT("31")

或者我最喜欢的:

_T("31")

这两个宏将在非 UNICODE 编译下生成“31”,在 UNICODE 编译下生成 L“31”。

您还应该使用适当的字符串函数来获取长度,对于 UNICODE 使用 wcslen,对于多字节字符集使用 strlen。您可以使用 _t* 宏为您检查字符集并使用 _tcslen() 获取长度。

实际上,在创建新项目时,您应该始终使用 UNICODE。

修复您的代码使用:

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"),_tcslen(TEXT("31"))*sizeof(TCHAR)) != ERROR_SUCCESS)

这里使用 sizeof(TCHAR) 是因为当定义了 UNICODE 时,单个字符的长度是两个字节,而 RegSetValueEx 需要的是字节数而不是字符数。

关于C++ REG_SZ 加值失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com