使用类型 reg_binary c++ 正确读取注册表值
Read a registry value correctly with the type reg_binary c++
我的问题是,我无法以十六进制格式正确检索注册表值,无法将其转换为字符串,因此它以这种方式出现在我的列表框中(图 1),我知道如何在C#,但我是 C++ 新手。
String ks;
DWORD reg2()
{
char value[255];
DWORD BufferSize = BUFFER;
RegGetValue(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
std::wstringstream box_messages;
box_messages << value;
ks = box_messages.str().c_str();
}
void __fastcall TAAP_Test::Button1Click(TObject *Sender)
{
ListBox1->Items->Add(ks);
}
这张图片显示了我的程序的结果:
这张图片显示了我要检索的注册表值:
您正在读取的注册表值是原始二进制格式 (REG_BINARY
)。您在注册表编辑器中看到的不是原始数据本身,而是数据的人类可读的十六进制表示形式。 RegGetValueA()
不会 return 十六进制表示,而是 return 原始二进制数据。
您可以很好地读取原始数据(减去缺少错误检查),但您正试图将其 按原样 写入您的 std::wstringstream
,这这就是为什么您会得到您在 ListBox 中看到的奇怪结果的原因。您需要循环遍历数据的各个字节,将每个字节编码为十六进制表示,然后将其放入 std::wstringstream
,例如:
#include <iostream>
#include <iomanip>
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
std::wstringstream box_messages;
for(DWORD i = 0; i < BufferSize; ++i) {
box_messages << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(value[i]) << L" ";
}
ks = box_messages.str().c_str();
}
else
ks = _D("error");
}
或者,RTL 具有可用的 IntToHex()
函数:
#include <System.SysUtils.hpp>
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
std::wstringstream box_messages;
for(DWORD i = 0; i < BufferSize; ++i) {
box_messages << IntToHex(static_cast<int>(value[i]), 2).c_str() << _D(" ");
}
ks = box_messages.str().c_str();
/* or simpler:
ks = _D("");
for(DWORD i = 0; i < BufferSize; ++i) {
ks += (IntToHex(static_cast<int>(value[i]), 2) + _D(" "));
}
*/
}
else
ks = _D("error");
}
或者,UnicodeString
有一个 cat_sprintf()
方法可用:
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
ks = _D("");
for(DWORD i = 0; i < BufferSize; ++i) {
ks.cat_sprintf(_D("%02X "), static_cast<int>(value[i]));
}
}
else
ks = _D("error");
}
我的问题是,我无法以十六进制格式正确检索注册表值,无法将其转换为字符串,因此它以这种方式出现在我的列表框中(图 1),我知道如何在C#,但我是 C++ 新手。
String ks;
DWORD reg2()
{
char value[255];
DWORD BufferSize = BUFFER;
RegGetValue(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
std::wstringstream box_messages;
box_messages << value;
ks = box_messages.str().c_str();
}
void __fastcall TAAP_Test::Button1Click(TObject *Sender)
{
ListBox1->Items->Add(ks);
}
这张图片显示了我的程序的结果:
这张图片显示了我要检索的注册表值:
您正在读取的注册表值是原始二进制格式 (REG_BINARY
)。您在注册表编辑器中看到的不是原始数据本身,而是数据的人类可读的十六进制表示形式。 RegGetValueA()
不会 return 十六进制表示,而是 return 原始二进制数据。
您可以很好地读取原始数据(减去缺少错误检查),但您正试图将其 按原样 写入您的 std::wstringstream
,这这就是为什么您会得到您在 ListBox 中看到的奇怪结果的原因。您需要循环遍历数据的各个字节,将每个字节编码为十六进制表示,然后将其放入 std::wstringstream
,例如:
#include <iostream>
#include <iomanip>
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
std::wstringstream box_messages;
for(DWORD i = 0; i < BufferSize; ++i) {
box_messages << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(value[i]) << L" ";
}
ks = box_messages.str().c_str();
}
else
ks = _D("error");
}
或者,RTL 具有可用的 IntToHex()
函数:
#include <System.SysUtils.hpp>
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
std::wstringstream box_messages;
for(DWORD i = 0; i < BufferSize; ++i) {
box_messages << IntToHex(static_cast<int>(value[i]), 2).c_str() << _D(" ");
}
ks = box_messages.str().c_str();
/* or simpler:
ks = _D("");
for(DWORD i = 0; i < BufferSize; ++i) {
ks += (IntToHex(static_cast<int>(value[i]), 2) + _D(" "));
}
*/
}
else
ks = _D("error");
}
或者,UnicodeString
有一个 cat_sprintf()
方法可用:
void reg2()
{
char value[255];
DWORD BufferSize = sizeof(value);
if (RegGetValueA(HKEY_CURRENT_USER, namebuf, "415846243", RRF_RT_ANY, NULL, value, &BufferSize) == ERROR_SUCCESS)
{
ks = _D("");
for(DWORD i = 0; i < BufferSize; ++i) {
ks.cat_sprintf(_D("%02X "), static_cast<int>(value[i]));
}
}
else
ks = _D("error");
}