函数参考


_WinAPI_RegQueryMultipleValues

检索注册表键的类型和名称值列表数据.

#Include <WinAPIEx.au3>
_WinAPI_RegQueryMultipleValues ( $hKey, ByRef $aValent, ByRef $pBuffer [, $iStart [, $iEnd]] )

参数

$hKey 注册表键句柄.注册表键必须有 KEY_QUERY_VALUE 存取权限.
句柄有 _WinAPI_RegCreateKey() 或 _WinAPI_RegOpenKey() 函数返回.
也可以是下列预定义键之一

$HKEY_CLASSES_ROOT
$HKEY_CURRENT_CONFIG
$HKEY_CURRENT_USER
$HKEY_LOCAL_MACHINE
$HKEY_PERFORMANCE_DATA
$HKEY_USERS
$aValent 二维数组 ([valuename1, 0, 0, 0], [valuename2, 0, 0, 0], ... [valuenameN, 0, 0, 0]),包含被检索的名称值.
不使用数组元素 1, 2, 与 3, 但该数组的大小应该是 [n][4], 否则, 函数将失败.
此外,如果指定键不存在任何指定值,此函数同样失败.
$pBuffer A pointer to a memory buffer that contains a registry data. Typically, you should not use this
buffer directly (see remarks).
$iStart [可选参数] 开始检索的数组索引.
$iEnd [可选参数] 结束检索的数组索引.

返回值

成功: 返回复制到缓冲区的字节数. $aValent 数组将包含以下数据:
[n][0] 名称值 (未改变的).
[n][1] 数据字节大小.
[n][2] 指向 $tData 参数值的缓冲区数据指针.
[n][3] 数据类型 ($REG_*).
失败: 返回 0,设置@error:非 0 值, @extended 可能包含系统错误代码.

注意/说明

为了防止过多的系列化, 由该函数返回的数据总数不能超过一兆字节.

When a returned registry data are no longer needed, you must free the allocated memory pointed to by the
$pBuffer parameter by calling the _WinAPI_FreeMemory() function.

相关

详情参考

在MSDN中搜索


示例/演示


#Include <APIConstants.au3>
#Include <Array.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $aValent[19][4], $hKey, $tData

; 注意如果下列值名称有一个没有在指定的注册表键中找到, 函数会失败!

; HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

$aValent[0 ][0] = 'AppData'
$aValent[1 ][0] = 'Cache'
$aValent[2 ][0] = 'Cookies'
$aValent[3 ][0] = 'Desktop'
$aValent[4 ][0] = 'Favorites'
$aValent[5 ][0] = 'History'
$aValent[6 ][0] = 'Local AppData'
$aValent[7 ][0] = 'My Music'
$aValent[8 ][0] = 'My Pictures'
$aValent[9 ][0] = 'My Video'
$aValent[10][0] = 'NetHood'
$aValent[11][0] = 'Personal'
$aValent[12][0] = 'PrintHood'
$aValent[13][0] = 'Programs'
$aValent[14][0] = 'Recent'
$aValent[15][0] = 'SendTo'
$aValent[16][0] = 'Start Menu'
$aValent[17][0] = 'Startup'
$aValent[18][0] = 'Templates'

_ArrayDisplay($aValent, '_WinAPI_RegQueryMultipleValues')

$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders', $KEY_QUERY_VALUE)
If @error Then
    MsgBox(16, @extended, _WinAPI_GetErrorMessage(@extended))
    Exit
EndIf
_WinAPI_RegQueryMultipleValues($hKey, $aValent, $pBuffer)
If @error Then
    MsgBox(16, @extended, _WinAPI_GetErrorMessage(@extended))
    Exit
EndIf

_WinAPI_RegCloseKey($hKey)

_ArrayDisplay($aValent, '_WinAPI_RegQueryMultipleValues')

For $i = 0 To UBound($aValent) - 1
    $aValent[$i][2] = DllStructGetData(DllStructCreate('wchar[' & $aValent[$i][1] & ']', $aValent[$i][2]), 1)
Next

_WinAPI_FreeMemory($pBuffer)

_ArrayDisplay($aValent, '_WinAPI_RegQueryMultipleValues')