मेरी समस्या यह है कि, मैं एक हेक्स प्रारूप में रजिस्ट्री मान को सही ढंग से पुनर्प्राप्त नहीं कर सकता, इसे एक स्ट्रिंग में परिवर्तित कर सकता हूं, इसलिए यह मेरे लिस्टबॉक्स (छवि 1) में इस तरह दिखाई देता है, मुझे पता है कि इसे सी # में सही तरीके से कैसे किया जाए, लेकिन मैं ' एम सी ++ के लिए नया।

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

0
Grey 11 अप्रैल 2020, 03:56

1 उत्तर

सबसे बढ़िया उत्तर

आप जो रजिस्ट्री मान पढ़ रहे हैं वह कच्चे बाइनरी प्रारूप (REG_BINARY) में है। रजिस्ट्री संपादक में आप जो देखते हैं वह स्वयं कच्चा डेटा नहीं है, बल्कि डेटा का मानव-पठनीय हेक्स प्रतिनिधित्व है। RegGetValueA() उस हेक्स प्रतिनिधित्व को आपको वापस नहीं करेगा, यह इसके बजाय कच्चे बाइनरी डेटा को वापस कर देगा।

आप कच्चे डेटा को ठीक से पढ़ रहे हैं (त्रुटि जांच की कमी से कम), लेकिन आप इसे अपने 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() फ़ंक्शन उपलब्ध है:

#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
Remy Lebeau 11 अप्रैल 2020, 01:54