以下示例演示了使用RegQueryInfoKey,RegEnumKey和RegEnumValue功能。传递给每个功能的【的hKeyru-Latn】参数是打开的键的句柄。该键必须在函数调用之前打开,之后关闭。
// QueryKey - 枚举给定键和相关联的子项
//值,然后复制关于键和值的信息
//进入一对编辑控件和列表框。
// hDlg - 包含编辑控件和列表框的对话框
// hKey - 其子项和值将被枚举的键
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];
//获取类名和值计数。
RegQueryInfoKey(hKey,/ * key handle * /
achClass,/ *缓冲区的类名* /
& cchClassName,/ *类字符串的长度* /
NULL,/ * reserved * /
& cSubKeys,/ *子项数* /
& cbMaxSubKey,/ *最长子项大小* /
& cchMaxClass,/ * longest class string * /
& cValues,/ *此键值的值*
& cchMaxValue,/ * longest value name * /
& cbMaxValueData / *最长值数据* /
& cbSecurityDescriptor,/ *安全描述符* /
& ftLastWriteTime); / *最后写入时间* /
SetDlgItemText(hDlg, IDE_CLASS, achClass);
SetDlgItemInt(hDlg, IDE_CVALUES, cValues, FALSE);
SendMessage(GetDlgItem(hDlg,IDL_LISTBOX))
LB_ADDSTRING, 0, (LONG) "..");
//枚举子键,循环直到RegEnumKey失败。然后
//获取每个子键的名称,并将其复制到列表框中。
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));
//枚举键值。
SetCursor(LoadCursor(NULL, IDC_WAIT));
如果(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';
//将每个值添加到列表框。
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));
}