Citation :
Platform SDK: Windows System Information Enumerating Registry Subkeys
The following example demonstrates the use of the RegQueryInfoKey, RegEnumKeyEx, and RegEnumValue functions. The hKey parameter passed to each function is a handle to an open key. This key must be opened before the function call and closed afterward.
// QueryKey - Enumerates the subkeys of key, and the associated // values, then copies the information about the keys and values // into a pair of edit controls and list boxes. // hDlg - Dialog box that contains the edit controls and list boxes.
// hKey - Key whose subkeys and values are to be enumerated.
void QueryKey(HWND hDlg, HANDLE hKey) { CHAR achKey[MAX_PATH]; CHAR achClass[MAX_PATH] = ""; // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time
DWORD i, j; DWORD retCode, retValue;
CHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; CHAR achBuff[80];
// Get the class name and the value count. RegQueryInfoKey(hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time
SetDlgItemText(hDlg, IDE_CLASS, achClass); SetDlgItemInt(hDlg, IDE_CVALUES, cValues, FALSE);
SendMessage(GetDlgItem(hDlg, IDL_LISTBOX), LB_ADDSTRING, 0, (LONG) ".." );
// Enumerate the child keys, until RegEnumKeyEx fails. Then // get the name of each child key and copy it into the list box. SetCursor(LoadCursor(NULL, IDC_WAIT)); for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++) { retCode = RegEnumKeyEx(hKey, i, achKey, MAX_PATH, NULL, NULL, NULL, &ftLastWriteTime); if (retCode == (DWORD)ERROR_SUCCESS) {
SendMessage(GetDlgItem(hDlg, IDL_LISTBOX), LB_ADDSTRING, 0, (LONG) achKey); }
} SetCursor(LoadCursor (NULL, IDC_ARROW));
// Enumerate the key values. SetCursor(LoadCursor(NULL, IDC_WAIT));
if (cValues) {
for (j = 0, retValue = ERROR_SUCCESS; j < cValues; j++) { cchValue = MAX_VALUE_NAME; achValue[0] = '\0'; retValue = RegEnumValue(hKey, j, achValue, &cchValue, NULL, NULL, // &dwType, NULL, // &bData, NULL); // &bcData
if (retValue == (DWORD) ERROR_SUCCESS ) { achBuff[0] = '\0';
// Add each value to a list box. if (!lstrlen(achValue)) lstrcpy(achValue, "<NO NAME>" ); wsprintf(achBuff, "%d) %s ", j, achValue); SendMessage(GetDlgItem(hDlg,IDL_LISTBOX2), LB_ADDSTRING, 0, (LONG) achBuff); } }
SetCursor(LoadCursor(NULL, IDC_ARROW)); }
|