Using the Registry

The following example demonstrates the use of the RegQueryInfoKey, RegEnumKey, and RegEnumValue functions. The hKey parameter passed to each function is the handle of an open key. This key must be opened before the function call and closed afterward.

// QueryKey - enumerates the subkeys of a given key and the associated

// values and 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; /* length 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, /* length 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, looping until RegEnumKey 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 = RegEnumKey(hKey, i, achKey, MAX_PATH);

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 &&

retValue != ERROR_INSUFFICIENT_BUFFER) {

wsprintf (achBuff,

"Line:%d 0 based index = %d, retValue = %d, "

"ValueLen = %d",

__LINE__, j, retValue, cchValue);

MessageBox (hDlg, achBuff, "Debug", MB_OK);

}

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));

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database