我试图读取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;
}
答案 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将它告诉您的信息放在哪里。