C++ 如何输出任何类型的注册表值
注册表值有许多类型REG_SZ、REG_EXPAND_SZ、REG_BINARY、REG_DWORD、 我可以通过函数RegQueryMultipleValues获取注册表值数据(数据类型为DWORD_PTR),但是根据每个注册表值类型,我必须找到一种方法来转换值以输出它。我一直在考虑在问题中使用“输出”一词,以表明我有这些值,但很难输出它 例如,我有下面的代码 这里我得到一个注册表值列表C++ 如何输出任何类型的注册表值,c++,registry,C++,Registry,注册表值有许多类型REG_SZ、REG_EXPAND_SZ、REG_BINARY、REG_DWORD、 我可以通过函数RegQueryMultipleValues获取注册表值数据(数据类型为DWORD_PTR),但是根据每个注册表值类型,我必须找到一种方法来转换值以输出它。我一直在考虑在问题中使用“输出”一词,以表明我有这些值,但很难输出它 例如,我有下面的代码 这里我得到一个注册表值列表 nErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HAR
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;i std::cout PS:关于我使用的REG_SZ大小写,如果字符是正常的拉丁字符,它可以很好地读取,但是如果它是一些非拉丁字符,如韩国、中国、日本……那么TCHAR*无法处理它-但是我看到regedit工具可以处理它-regedit工具是如何做到的???您使用的是std::cout
,它适用于用户的ANSI数据的默认区域设置。如果TCHAR
映射到char
,则可以(RegQueryMultipleValues()
将以正确的ANSI格式输出),否则必须使用WideCharToMultiByte()转换数据
,或者改用std::wcout
。StackOverflow上有很多关于如何将Unicode文本发送到控制台输出的问题。本主题具有FormatDataWithDataType函数,但仍有一些案例没有实现。