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

C++ 如何输出任何类型的注册表值,c++,registry,C++,Registry,注册表值有许多类型REG_SZ、REG_EXPAND_SZ、REG_BINARY、REG_DWORD、 我可以通过函数RegQueryMultipleValues获取注册表值数据(数据类型为DWORD_PTR),但是根据每个注册表值类型,我必须找到一种方法来转换值以输出它。我一直在考虑在问题中使用“输出”一词,以表明我有这些值,但很难输出它 例如,我有下面的代码 这里我得到一个注册表值列表 nErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HAR

注册表值有许多类型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;
    }
}
VALENT-crtReg;
德沃德值;
DWORD*PDW值;
对于(int i=0;istd::cout PS:关于我使用的REG_SZ大小写,如果字符是正常的拉丁字符,它可以很好地读取,但是如果它是一些非拉丁字符,如韩国、中国、日本……那么TCHAR*无法处理它-但是我看到regedit工具可以处理它-regedit工具是如何做到的???您使用的是
std::cout
,它适用于用户的ANSI数据的默认区域设置。如果
TCHAR
映射到
char
,则可以(
RegQueryMultipleValues()
将以正确的ANSI格式输出),否则必须使用
WideCharToMultiByte()转换数据
,或者改用
std::wcout
。StackOverflow上有很多关于如何将Unicode文本发送到控制台输出的问题。本主题具有FormatDataWithDataType函数,但仍有一些案例没有实现。