正确读取类型为reg_binary c ++的注册表值

问题描述 投票:0回答:1

我的问题是,我无法以十六进制格式正确检索注册表值,无法将其转换为字符串,因此它以这种方式出现在ListBox中(图像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);
}

此图显示了我程序的结果:

image

此图像显示了我要检索的注册表值:

image

c++ registry c++builder regedit
1个回答
0
投票

您正在读取的注册表值是原始二进制格式(REG_BINARY)。在注册表编辑器中看到的不是原始数据本身,而是数据的人类可读的十六进制表示形式。 RegGetValueA()不会将十六进制表示形式返回给您,而是将返回原始二进制数据。

您正在读取原始数据(没有缺少错误检查),但是您尝试将其as-is写到std::wstringstream,这就是为什么您在您的计算机中看到奇怪的结果的原因列表框。您需要循环遍历数据的各个字节,将每个字节编码为十六进制表示形式,然后将其放入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()功能可用:

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()
© www.soinside.com 2019 - 2024. All rights reserved.