RegQueryValueEx и REG_BINARY - PullRequest
       3

RegQueryValueEx и REG_BINARY

2 голосов
/ 09 августа 2010

Я пытался прочитать значение REG_BINARY в реестре Windows, но я не знаю как ... Я действительно новичок в мире c ++ и надеюсь, что вы будете крутым и поможете мне с этой проблемой.

Я нашел этот код на этом сайте, я знаю, что это не делает работу, а просто для того, чтобы вы знали, что я пытаюсь сделать.

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HKEY hKey;
    DWORD dwDisp = REG_BINARY;
    DWORD dwSize = sizeof(dwDisp);
    DWORD dwValue = 0;
    DWORD dwReturn;
    DWORD dwBufSize = sizeof(dwDisp);

    if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
    {
        DWORD error = RegQueryValueEx(hKey,"DigitalProductId",0,0, (LPBYTE)&dwReturn, &dwBufSize);
        if(error == ERROR_SUCCESS)
        {
            cout << "Key value is :" << dwReturn << endl;
        }
        else
        {
           cout << "Cannot query for key value; Error is : " << error << endl;
        }
    }

    RegCloseKey(hKey);

    return 0;
}

PS Яиспользование gcc без .net.

Спасибо за вашу помощь, она будет очень признательна.


Спасибо всем!Есть полнофункциональный код:

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HKEY hKey;
    DWORD dwBufSize = 200;
    UCHAR dwReturn[200];
    UCHAR digits[] = {'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'};
    UCHAR strresult[26];

    if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
    {
        DWORD error = RegQueryValueEx(hKey,"DigitalProductId",0,0, (LPBYTE)dwReturn, &dwBufSize);
        if(error == ERROR_SUCCESS)
        {

            for (int i=24;i>=0;i--) {
                int x=0;

                for (int j=14;j>=0;j--) {
                x = (x<<8) + (dwReturn+0x34)[j];
                (dwReturn+0x34)[j] = x / 24;
                x = x % 24;
                }
                strresult[i]=digits[x];
            }

            string part1, part2, part3, part4, part5;
            string str;
            string strRetVal;

            for(int i = 0; strresult[i] != 0; i++)
            {
                str += strresult[i];
            }

            part1 = str.substr(0,5) + "-";
            part2 = str.substr(5,5) + "-";
            part3 = str.substr(10,5) + "-";
            part4 = str.substr(15,5) + "-";
            part5 = str.substr(20,5);

            strRetVal = part1 + part2 + part3 + part4 + part5;

            cout << "Windows Key : " << strRetVal << endl;
        }
        else
        {
           cout << "Cannot query for key value; Error is : " << error << ", dwBufSize="<<dwBufSize<<endl;
        }
    }

    RegCloseKey(hKey);

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Есть две проблемы с кодом, который вы разместили - буфер для двоичного значения слишком мал и KEY_ALL_ACCESS может быть слишком много, чтобы запросить, KEY_QUERY_VALUE достаточно.

Вот код, в котором исправлены эти ошибки. Вы можете изменить dwReturn [1000] на dwReturn [1] и увидеть, что RegQueryValueEx возвращает ошибку и требуемый размер буфера.

int main()
{
    HKEY hKey;
    DWORD dwReturn[1000];  //dwReturn[1]
    DWORD dwBufSize = sizeof(dwReturn);

    if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
    {
        DWORD error = RegQueryValueEx(hKey,"DigitalProductId",0,0, (LPBYTE)dwReturn, &dwBufSize);
        if(error == ERROR_SUCCESS)
        {
            cout << "dwReturn[0]=" << dwReturn[0] << ", dwBufSize=" << dwBufSize <<endl;
        }
        else
        {
           cout << "Cannot query for key value; Error is : " << error << ", dwBufSize="<<dwBufSize<<endl;
        }
    }

    RegCloseKey(hKey);

    return 0;
}

Обратите внимание, что в случае "DigitalProductId" первый DWORD содержит длину, поэтому dwReturn [0] и dwBufSize одинаковы.

0 голосов
/ 09 августа 2010

Когда вы запрашиваете значение, вы не можете сказать Windows, что тип значения является двоичным. Вы запрашиваете значение, Windows сообщит вам, что это за тип (и какое значение), и вы должны предоставить несколько указателей, чтобы сообщить Windows, куда поместить информацию, которую она сообщит вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...