目前我使用RegQueryValueEx()
来检索可能以REG_SZ
或REG_DWORD
写入的注册表值。
BYTE byteArray[MAX];
DWORD dataSize = sizeof(byteArray);
DWORD type = 0;
RegQueryValueEx(
hKey,
subKey,
nullptr,
&type,
reinterpret_cast<BYTE*>(&byteArray),
&dataSize));
当我得到一个REG_SZ
值的数据时(例如:“42314”),我得到这样的回应:
byteArray 0x004fe6a8 "4" unsigned char[100]
[0] 52 '4' unsigned char
[1] 0 '\0' unsigned char
[2] 50 '2' unsigned char
[3] 0 '\0' unsigned char
[4] 51 '3' unsigned char
[5] 0 '\0' unsigned char
[6] 49 '1' unsigned char
[7] 0 '\0' unsigned char
[8] 52 '4' unsigned char
[9] 0 '\0' unsigned char
[10]0 '\0' unsigned char
有没有什么方法可以让每个字符后面都有空字节?我认为这是因为RegEnumValue()
被调用为每个字符,但我不确定。
2条答案
按热度按时间px9o7tmv1#
您的问题与
RegEnumValue()
无关。您的应用正在调用基于
TCHAR
的RegQueryValueEx()
,这实际上是一个预处理器宏,它Map到RegQueryValueExA()
(ANSI)或RegQueryValueExW()
(Unicode),具体取决于UNICODE
是否在编译时定义。RegQueryValueExW()
以UTF-16 LE格式的Unicode文本返回字符串数据,这正是您在缓冲区中看到的内容,因此很明显您的应用正在为Unicode编译。你看到的是完全正常的行为。因此,您需要以给定的格式处理字符串数据,例如:
或者:
如果你想在其他格式的文本,你将不得不:
1.在将其阅读为Unicode后将其转换为Unicode,例如使用
WideCharToMultiByte()
或等效项。1.直接使用
RegQueryValueExA()
(或RegGetValueA()
),这将返回用户当前区域设置中的ANSI文本形式的字符串数据,根据文档:如果数据类型为
REG_SZ
、REG_MULTI_SZ
或REG_EXPAND_SZ
,并且使用了此函数的ANSI版本(通过显式调用RegQueryValueExA
或在包含Windows.h
文件之前不定义UNICODE
),则此函数将存储的Unicode字符串转换为ANSI字符串,然后将其复制到lpData
指向的缓冲区。无论哪种方式,请注意,您将面临丢失任何非ASCII字符的风险,这些字符不存在于您决定转换的目标字符集中。因此,最好还是坚持使用Unicode,并将缓冲区数据作为
WCHAR
数据处理(当定义UNICODE
时,TCHAR
Map到的数据)。w8rqjzmb2#