#include <registry.hpp>
#include <memory>
void __fastcall ReadKeyValues(HKEY hKey, String subKey, TListView *ListView)
{
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey = hKey; /* otwieram drzewo */
/* otwieram klucz, false - nie tworzę jeżeli klucz nie istnieje */
if( !Rejestr->OpenKey(subKey, false) )
{
ShowMessage("Nieprawidłowy klucz!");
delete Rejestr;
return;
}
std::auto_ptr<TStrings> vList(new TStringList);
Rejestr->GetValueNames(vList.get());
ListView->Items->Clear();
int x = -1;
while(vList->Count - 1 > x++)
{
String ValueName = vList->Strings[x];
TRegDataType rDT = Rejestr->GetDataType(ValueName);
String DataType = "";
String DataValue = Rejestr->GetDataAsString(ValueName, false);
switch(rDT)
{
case rdUnknown:
{
DataType = "REG_MULTI_SZ";
TCHAR lpByte[8192];
DWORD lpcbData = 8192;
HKEY hqKey;
if(RegOpenKeyEx( hKey, subKey.c_str(), 0,
KEY_QUERY_VALUE, &hqKey) == ERROR_SUCCESS)
{
if( RegQueryValueEx( hqKey, ValueName.c_str(), NULL, NULL,
(LPBYTE)lpByte, &lpcbData) == ERROR_SUCCESS)
{
DataValue = lpByte;
}
RegCloseKey(hqKey);
}
break;
}
case rdString: DataType = "REG_SZ"; break;
case rdBinary: DataType = "REG_BINARY"; break;
case rdInteger:
{
DataType = "REG_DWORD";
int iVal = DataValue.ToIntDef(0);
DataValue = StringReplace(Rejestr->GetDataAsString(ValueName, true),
"dword:", "0x", TReplaceFlags() << rfReplaceAll)
+ " (" + (String)iVal + ")";
break;
}
case rdExpandString: DataType = "REG_EXPAND_SZ"; break;
}
TListItem * ElementListy = ListView->Items->Add();
ElementListy->Caption = ValueName;
ElementListy->SubItems->Add(DataType);
ElementListy->SubItems->Add(DataValue);
}
delete Rejestr;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ReadKeyValues( HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System",
ListView1 );
}