RegSetValueEx:使用const BYTE数据类型

时间:2016-05-19 16:50:13

标签: c winapi

我试图搜索这个问题,但在这里找不到任何东西:

我正在尝试使用 C代码 WinAPI 中的RegSetValueEx函数以及官方文档中定义的数据类型创建注册表值。我使用了这些定义:

PTCHAR regValueName = TEXT("dwValue");
DWORD regValueType = REG_DWORD;
BYTE regData = 1;
const BYTE *pRegData = &regData;
DWORD dataSize = sizeof(regData);

HKEY返回RegCreateKeyEx值,我未在此处显示。

这就是我使用该功能的方式:

setValueKey = RegSetValueEx(*pHandleResult, regValueName, reserved,
                            regValueType, pRegData, dataSize);

setValueExLONG类型。

正如您所注意到的,我正在尝试创建DWORD值,因此我将BYTE regData值定义为1,然后将const BYTE指针定义为该值,但是它不起作用。该值已创建,但数据显示:

  

无效的DWORD 32位值。

Registry view

我知道BYTE数据类型定义为unsiged char,但我尝试了'1'并且无效。我也知道使用DWORD值作为 regData 类型有效,但我想知道为什么官方数据类型不适用于DWORD值。

有谁能告诉我如何使用BYTE数据类型创建值?

我没有提供所有代码,但如果需要,我会。

感谢。

2 个答案:

答案 0 :(得分:5)

您想要存储DWORD,但要为其BYTE。首先,这意味着DWORD的一部分将是未定义的。其次,更严重的是,datasize将为1,但这对DWORD值无效。它需要是4而不是。

要存储的类型,指向该值的指针以及该值的大小都必须正确。

LPCTSTR regValueName = TEXT("dwValue");
DWORD regValueType = REG_DWORD;
DWORD regData = 1;
const BYTE *pRegData = (BYTE *) &regData;
DWORD dataSize = sizeof(regData);

setValueKey = RegSetValueEx(*pHandleResult, regValueName, reserved,
                            regValueType, pRegData, dataSize);

或者简单地说:

DWORD regData = 1;
setValueKey = RegSetValueEx(*pHandleResult, TEXT("dwValue"), reserved,
                            REG_DWORD, (BYTE *) &regData, sizeof(regData));

答案 1 :(得分:1)

  

有谁能告诉我如何使用BYTE数据类型创建值?

BYTE的大小只有1个字节,但注册表期望REG_DWORD的值大小为4个字节。因此,在处理REG_DWORD值时,您必须读取/写入4个字节,不多也不少。

如果您的代码的值存储在BYTE中,并且您希望将其作为REG_DWORD写入注册表,则必须先将其扩展为DWORD,例如:< / p>

BYTE value = 1;
...
DWORD regDATA = value; // <-- here
BYTE *pRegData = (BYTE*) &regData;

否则,如果您确实只想使用1个字节向注册表写入BYTE值,则必须使用REG_BINARY而不是REG_DWORD

有关详细信息,请参阅MSDN:

Registry Value Types