你的问题与
RegEnumValue()
.
你的应用正在调用
TCHAR
-基于
RegQueryValueEx()
,它实际上是一个预处理器宏,映射到
RegQueryValueExA()
(ANSI)或
RegQueryValueExW()
(Unicode),取决于
UNICODE
RegQueryValueXw()
以UTF-16LE格式的Unicode文本形式返回字符串数据,这正是您在缓冲区中看到的,因此很明显,您的应用程序是为Unicode编译的。你看到的是完全正常的行为。
BYTE byteArray[MAX];
DWORD dataSize = sizeof(byteArray);
DWORD type = 0;
if (RegQueryValueEx( // <-- calling the TCHAR version!
hKey,
subKey,
nullptr,
&type,
reinterpret_cast<BYTE*>(&byteArray),
&dataSize) == 0)
{
switch (type)
{
case REG_DWORD:
{
LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
// use *value as needed ...
break;
}
case REG_SZ:
case REG_MULTI_SZ:
case REG_EXPAND_SZ:
{
// note the T in LPTSTR! That means 'TCHAR' is used...
LPTSTR text = reinterpret_cast<LPTSTR>(&byteArray);
// use text as needed, up to (dataSize/sizeof(TCHAR)) number
// of TCHARs. This is because RegQueryValueEx() does not
// guarantee the output data has a null terminator. If you
// want that, use RegGetValue() instead...
break;
}
}
}
或:
BYTE byteArray[MAX];
DWORD dataSize = sizeof(byteArray);
DWORD type = 0;
if (RegQueryValueExW( // <-- calling the UNICODE version!
hKey,
subKey,
nullptr,
&type,
reinterpret_cast<BYTE*>(&byteArray),
&dataSize) == 0)
{
switch (type)
{
case REG_DWORD:
{
LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
// use *value as needed ...
break;
}
case REG_SZ:
case REG_MULTI_SZ:
case REG_EXPAND_SZ:
{
// note the W in LPWSTR! That means 'WCHAR' is used...
LPWSTR text = reinterpret_cast<LPWSTR>(&byteArray);
// use text as needed, up to (dataSize/sizeof(WCHAR)) number
// of WCHARs. This is because RegQueryValueExW() does not
// guarantee the output data has a null terminator. If you
// want that, use RegGetValueW() instead...
break;
}
}
}
-
将其读取为Unicode后进行转换,例如使用
WideCharToMultiByte()
或等效。
-
使用
RegQueryValueExA()
(或
RegGetValueA()
REG_SZ
REG_MULTI_SZ
或
REG_EXPAND_SZ
RegQueryValueExA
或者不定义
UNICODE
在包括
Windows.h
该函数将存储的Unicode字符串转换为ANSI字符串,然后将其复制到
lpData
.
BYTE byteArray[MAX];
DWORD dataSize = sizeof(byteArray);
DWORD type = 0;
if (RegQueryValueExA( // <-- calling the ANSI version
hKey,
subKey,
nullptr,
&type,
reinterpret_cast<BYTE*>(&byteArray),
&dataSize) == 0)
{
switch (type)
{
case REG_DWORD:
{
LPDWORD value = reinterpret_cast<LPDWORD>(&byteArray);
// use *value as needed ...
break;
}
case REG_SZ:
case REG_MULTI_SZ:
case REG_EXPAND_SZ:
{
// note the lack of T in LPSTR! That means 'char' is used...
LPSTR text = reinterpret_cast<LPSTR>(&byteArray);
// use text as needed, up to dataSize number of chars. This
// is because RegQueryValueExA() does not guarantee the
// output data has a null terminator. If you want that,
// use RegGetValueA() instead...
break;
}
}
}
无论是哪种方式,只要注意,您都有可能丢失您决定转换为的目标字符集中不存在的任何非ASCII字符。因此,最好坚持使用Unicode,并按如下方式处理缓冲区数据
WCHAR
数据(什么
TCHAR公司
映射到何时