RegQueryValueEx和REG_BINARY

时间:2010-08-09 04:38:02

标签: c++ registry

我试图读取Windows注册表的REG_BINARY值,但我不知道如何......我对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;
}

P.S。我正在使用没有.net的gcc。

感谢您的帮助,我们将非常感激。


谢谢大家! 有完整功能的代码:

#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 个答案:

答案 0 :(得分:2)

您发布的代码存在两个问题 - 二进制值的缓冲区太小而且 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是相同的。

答案 1 :(得分:0)

当您查询某个值时,您无法告诉Windows该值的类型是二进制。您查询该值,Windows将告诉您该类型是什么(以及值是什么),并且您必须提供一些指示来告诉Windows将它告诉您的信息放在哪里。

相关问题