首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ REG_SZ增值失败

C++ REG_SZ增值失败
EN

Stack Overflow用户
提问于 2012-11-19 05:39:30
回答 2查看 933关注 0票数 0

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

代码语言:javascript
复制
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;
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-19 06:05:45

RegSetValueEx在winreg.h中的定义如下:

代码语言:javascript
复制
#ifdef UNICODE
#define RegSetValueEx  RegSetValueExW
#else
#define RegSetValueEx  RegSetValueExA
#endif // !UNICODE

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

代码语言:javascript
复制
TEXT("31")

或者我最喜欢的:

代码语言:javascript
复制
_T("31")

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

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

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

要修复您的代码,请使用:

代码语言:javascript
复制
if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"),_tcslen(TEXT("31"))*sizeof(TCHAR)) != ERROR_SUCCESS)

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

票数 2
EN

Stack Overflow用户

发布于 2014-06-20 11:12:48

MSDN中描述了“如果数据是REG_SZ、REG_EXPAND_SZ或REG_MULTI_SZ类型,则cbData必须包含一个或多个终止空字符的大小。”

所以我猜代码应该是:

代码语言:javascript
复制
if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"), (_tcslen(TEXT("31")) + 1)*sizeof(TCHAR)) != ERROR_SUCCESS)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13444899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档