// EnumRegValue.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <string> //使用STL中的string对象需要的头文件
//该函数用于将二进制数据转换成字符串,并返回一个string对象,它返回的是一个MBCS编码的字符串。
std::string HexToString(PBYTE pByte, long lLength)
{
std::string strResult;
const char cCharTable[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int iPos=28;
std::string strTemp;
for(int i=0;i<lLength;i++)
{
iPos=28;
strTemp.erase();
while(!((pByte[i]>>iPos) & 0xf) && iPos>0)
{
iPos-=4;
}
for(int j=1;j<2-iPos/4;j++)
{
strTemp+=_T('0');
}
for(;iPos>=0;iPos-=4)
{
strTemp+=cCharTable[(pByte[i]>>iPos) & 0xf];
}
strResult+=strTemp;
}
return strResult;
}
int main(int argc, char* argv[])
{
HKEY hMainKey = HKEY_CURRENT_USER;
HKEY hSubKey;
//打开HKEY_CURRENT_USER\Control Panel\Desktop键句柄,以枚举其下面的子键值
LONG ReturnValue = ::RegOpenKeyEx (hMainKey, _T("Control Panel\\Desktop"),
0L, KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE, &hSubKey);
DWORD dwSubKeyValueCount = 0, dwMaxValueLen = 0;
if (ReturnValue == ERROR_SUCCESS) //如果成功打开
{
//查询HKEY_CURRENT_USER\Control Panel\Desktop键下子键值的个数以及子键值数据中所占内存最大的字节数。
RegQueryInfoKey(hSubKey, NULL, NULL, NULL, NULL,
NULL, NULL, &dwSubKeyValueCount, NULL, &dwMaxValueLen, NULL, NULL);
TCHAR tcValueName[128] = {0}; //用于保存每个子键值的名字的内存空间
DWORD dwValueNameSize = 128, dwValueType, dwValueSize;
PBYTE pValueData = new BYTE[dwMaxValueLen]; //分配足够大的内存用于保存子键值数据
printf(_T("%-25s%-20s%-20s"), _T("键值名称"), _T("键值类型"), _T("键值数据"));
printf(_T("\n"));
for (int i=0; i<dwSubKeyValueCount; i++)
{
dwValueSize = dwMaxValueLen;
memset(pValueData, 0, dwMaxValueLen);
RegEnumValue(hSubKey, i, tcValueName, &dwValueNameSize,
NULL, &dwValueType, pValueData, &dwValueSize);
printf("%-25s", tcValueName);
dwValueNameSize=128;
switch (dwValueType) //判断子键值的类型
{
case REG_SZ: //字符串
{
printf(_T("%-20s"), _T("REG_SZ"));
printf(_T("%-20s"), pValueData);
}
break;
case REG_DWORD: //DWORD双字类型
{
printf(_T("%-20s"), _T("REG_DWORD"));
printf(_T("%-20x"), *(DWORD *)pValueData);
}
break;
case REG_BINARY: //二进制类型
{
printf(_T("%-20s"), _T("REG_BINARY"));
//将二进制数据转换成字符串以便输出到屏幕.
printf(_T("%-20s"),HexToString(pValueData,dwValueSize).c_str());
}
break;
}
printf(_T("\n"));
}
if(pValueData != NULL)
{
delete []pValueData; //释放申请的资源
}
}
return 0;
}