簡體   English   中英

使用 reg_binary c++ 類型正確讀取注冊表值

[英]Read a registry value correctly with the type reg_binary c++

我的問題是,我無法以十六進制格式正確檢索注冊表值,將其轉換為字符串,因此它在我的 ListBox 中以這種方式顯示(圖 1),我知道如何在 C# 中正確執行此操作,但我m 是 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()不會向您返回該十六進制表示,而是返回原始二進制數據。

您正在很好地讀取原始數據(減去缺少錯誤檢查),但您正在嘗試將其按原樣寫入您的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() function 可用:

#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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM