// 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;}