C ++ REG_SZ值添加失败

时间:2012-11-18 21:39:30

标签: c++ winapi registry

此代码的目的是添加或编辑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;
} 

2 个答案:

答案 0 :(得分:2)

RegSetValueEx在winreg.h中定义如下:

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

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

TEXT("31")

或我最喜欢的:

_T("31")

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

你也应该使用正确的字符串函数,长度使用wcslen用于UNICODE和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需要字节数而不是字符数。

答案 1 :(得分:0)

MSDN中描述了&#39;如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,则cbData必须包含终止空字符或字符的大小。&#39;

所以我想代码应该是:

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