如何输出任何类型的注册表值

时间:2017-05-31 01:50:43

标签: c++ registry

注册表值有很多类型REG_SZ,REG_EXPAND_SZ,REG_BINARY,REG_DWORD,...

我可以通过函数RegQueryMultipleValues获取注册表值数据(数据类型为DWORD_PTR),但是依赖于每个注册表值类型,我必须找到一种方法来转换值来输出它。我一直在考虑决定在问题中使用输出这个词,以明确我有值 - 但很难输出它。

例如,我有以下代码

这里我得到一个注册表值列表

nErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DEVICEMAP\\VIDEO"), 0, KEY_READ, &hOpenKey);
PVALENT val_list;//List registry data
DWORD num_vals; //The length of val_list
LPTSTR lpValueBuf;//the buffer receives the data for each value
DWORD ldwTotsize;//the size of the buffer pointed to by the lpValueBuf parameter
//Some code to assign these value above...
//Now get the values of the list registry
RegQueryMultipleValues(hOpenKey, val_list, num_vals, lpValueBuf, &ldwTotsize);

现在我尝试使用婴儿步骤输出这些值

VALENT crtReg;
DWORD dwValue;
DWORD* pDwValue;
for (int i = 0; i < num_vals; i++)
{
    crtReg = val_list[i];
    switch (crtReg.ve_type)
    {
    case REG_DWORD:
        /*This is ok*/
        pDwValue = (DWORD*)crtReg.ve_valueptr;
        dwValue = *pDwValue;
        std::cout << "DWORD Key name: \n"
            << crtReg.ve_valuename
            << "\n value: "
            << dwValue
            << "\n len: "
            << crtReg.ve_valuelen;
        std::cout << "\n===========\n";
        break;
    case REG_SZ:
        /*This is ok*/
        std::cout << "String Key name: \n"
            << crtReg.ve_valuename
            << "\n value: "
            << (TCHAR*)crtReg.ve_valueptr
            << "\n len: "
            << crtReg.ve_valuelen;
        std::cout << "\n===========\n";

        break;
    case REG_BINARY:
        /*Tricky...*/
        std::cout << "Binary Key name: \n"
            << crtReg.ve_valuename
            << "\n value: (wait implement)"
            << "\n len: "
            << crtReg.ve_valuelen;
        std::cout << "\n===========\n";
        break;
    default:
        /*Really tricky...*/
        std::cout << "Else Key name: \n"
            << crtReg.ve_valuename
            << "\n value: (wait implement)"
            << "\n len: "
            << crtReg.ve_valuelen;
        std::cout << "\n===========\n";
        break;
    }
}

正如你在上面的代码中看到的,我切换case并为每种类型转换值,但是有些类型我不知道如何转换 - 比如二进制和其他(好的,我只知道如何施放DWORD和SZ类型)。如果有办法输出任何类型,请帮助我,即使将来有类似REG_ULTIMATE_3D的新类型(我认为MS提供了一个功能,但我搜索并找不到它 - 也许有但是我不够好找到它)。如果无法输出任何类型,请教我如何输出每种类型。

0 个答案:

没有答案