Значение реестра, которое вы читаете, находится в необработанном двоичном формате (REG_BINARY
). В редакторе реестра вы видите не сами необработанные данные, а читабельное шестнадцатеричное представление данных. RegGetValueA()
не вернет вам это шестнадцатеричное представление, вместо этого он вернет необработанные двоичные данные.
Вы прекрасно читаете необработанные данные (за исключением отсутствия проверки ошибок), но пытаетесь записать их как есть к вашему std::wstringstream
, поэтому вы получаете странный результат, который видите в своем ListBox. Вместо этого вам нужно l oop через отдельные байты данных, кодируя каждый байт в шестнадцатеричное представление, которое затем вставляется в ваш 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");
}