我试图搜索这个问题,但在这里找不到任何东西:
我正在尝试使用 C代码和 WinAPI 中的RegSetValueEx
函数以及官方文档中定义的数据类型创建注册表值。我使用了这些定义:
PTCHAR regValueName = TEXT("dwValue");
DWORD regValueType = REG_DWORD;
BYTE regData = 1;
const BYTE *pRegData = ®Data;
DWORD dataSize = sizeof(regData);
HKEY
返回RegCreateKeyEx
值,我未在此处显示。
这就是我使用该功能的方式:
setValueKey = RegSetValueEx(*pHandleResult, regValueName, reserved,
regValueType, pRegData, dataSize);
setValueEx
是LONG
类型。
正如您所注意到的,我正在尝试创建DWORD
值,因此我将BYTE
regData值定义为1,然后将const BYTE
指针定义为该值,但是它不起作用。该值已创建,但数据显示:
无效的DWORD 32位值。
我知道BYTE
数据类型定义为unsiged char
,但我尝试了'1'
并且无效。我也知道使用DWORD
值作为 regData 类型有效,但我想知道为什么官方数据类型不适用于DWORD
值。
有谁能告诉我如何使用BYTE数据类型创建值?
我没有提供所有代码,但如果需要,我会。
感谢。
答案 0 :(得分:5)
您想要存储DWORD
,但要为其BYTE
。首先,这意味着DWORD的一部分将是未定义的。其次,更严重的是,datasize
将为1,但这对DWORD值无效。它需要是4而不是。
要存储的类型,指向该值的指针以及该值的大小都必须正确。
LPCTSTR regValueName = TEXT("dwValue");
DWORD regValueType = REG_DWORD;
DWORD regData = 1;
const BYTE *pRegData = (BYTE *) ®Data;
DWORD dataSize = sizeof(regData);
setValueKey = RegSetValueEx(*pHandleResult, regValueName, reserved,
regValueType, pRegData, dataSize);
或者简单地说:
DWORD regData = 1;
setValueKey = RegSetValueEx(*pHandleResult, TEXT("dwValue"), reserved,
REG_DWORD, (BYTE *) ®Data, 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*) ®Data;
否则,如果您确实只想使用1个字节向注册表写入BYTE
值,则必须使用REG_BINARY
而不是REG_DWORD
。
有关详细信息,请参阅MSDN: