DWORD cSubKeys;//子项的数量
DWORD cbMaxClass;//最长子项的长度
DWORD cValues;//值的数量
DWORD cchMaxValue;//项的值名的最大长度
DWORD cbMaxValue;//值名字的最大长度
DWORD cbMaxValueData;//值数据的最大长度
DWORD TYPE;//值的类型
DWORD i,j;
DWORD retCode,retValue; HKEY hKey; DWORD cchValue=MAX_PATH;
if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
AfxMessageBox(_T("Open fail......"));
RegQueryInfoKey(hKey,//句柄
NULL,NULL,NULL,&cSubKeys,//子项的数量
&cbMaxClass,//最长子项的长度
NULL,//子项最长类名的长度
&cValues,//项的值的数量
&cchMaxValue,//项的值名的最大长度
&cbMaxValueData,//直数据的最大长度
NULL,NULL);
cbMaxValueData++,cchMaxValue++;//值名的长度和数据的长度加1
CString num;
num.Format(_T("%lu"),cValues);
if (cValues>1)
{
cchValue=MAX_PATH;
    wchar_t* achValue=(wchar_t*)malloc(cchMaxValue);
LPBYTE ValueData=(LPBYTE)malloc(cbMaxValueData);
if((retValue=RegEnumValue
(hKey,//句柄
1,//第1项
achValue,//项值,类型为LPWSTR
&cchMaxValue,//值名的最大长度
NULL,
&TYPE,//项的类型
ValueData,//装载值的数据
&cbMaxValueData//值数据的长度
))==ERROR_SUCCESS)
{
CString Data;
Data.Format(_T("%s"),ValueData);
DWORD ValueMbNum=WideCharToMultiByte(CP_ACP,0,achValue,-1,NULL,0,NULL,FALSE);//获得宽字符achValue转换成char的长度
char* mbValue=(char*)malloc(ValueMbNum);
WideCharToMultiByte(CP_ACP,0,achValue,-1,mbValue,ValueMbNum,NULL,0);//将宽字符achValue转换成char
CString ValueName;
ValueName.Format(_T("%s"),mbValue);//将char转换成CString
                AfxMessageBox(num);//输出值的个数
AfxMessageBox(Data);//输出值项的数据
AfxMessageBox(ValueName);//输出值项的名字
}
输出的值的个数是6,值项的数据是空的,值项的名字是乱码。求指教。

解决方案 »

  1.   

    if((retValue=RegEnumValue
    (hKey,//句柄
    1,//第1项
    achValue,//项值,类型为LPWSTR
    &cchMaxValue,//值名的最大长度
    NULL,
    &TYPE,//项的类型
    ValueData,//装载值的数据
    &cbMaxValueData//值数据的长度
    ))==ERROR_SUCCESS)ValueData这个不是宽字符数据,不用WideCharToMultiByteValueData转换成
      

  2.   


    输出它的值没有问题,但是它的值名achValue是LPWSTR类型的,不知道如何输出。