# RegRead

从注册表读取值.

    Value := RegRead(KeyName, ValueName, Default)

## 参数

KeyName

  类型: 字符串

  注册表键的全名, 例如 `"HKLM\Software\SomeApplication"`.

  必须以 HKEY_LOCAL_MACHINE(或 HKLM), HKEY_USERS(或 HKU), HKEY_CURRENT_USER(或 HKCU), HKEY_CLASSES_ROOT(或 HKCR) 或 HKEY_CURRENT_CONFIG(或 HKCC) 开始.

  要访问远程注册表, 请在前面加上计算机名和反斜杠, 例如 `"\\workstation01\HKLM"`.

  只有在注册表循环时, 才能省略 KeyName, 在这种情况下, 默认为当前循环项目的键. 如果项目是子键, 则默认使用该子键的全名. 如果项目是值, 则 ValueName 默认为该值的名称, 但是可以被重写.

ValueName

  类型: 字符串

  如果未设置或省略, 将删除键的默认值(除了上面提到的), 这是 RegEdit 中显示为 "(默认)". 否则, 请指定将检索值的名称. 如果没有默认值(即注册表中显示 "数值未设置"), 则抛出一个 OSError.

Default

  类型: Any

  如果未设置或省略, 则抛出 OSError, 而不是返回默认值. 否则, 如果指定的键或值不存在, 请指定要返回的值.

## 返回值

类型: 字符串或整数

函数返回指定注册表键的值.

## 错误处理

如果遇到问题(如不存在的键或值且省略 Default, 或权限错误), 则抛出 OSError.

A_LastError 被设置为操作系统 GetLastError() 函数返回的结果.

## 备注

目前只支持以下值类型: REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD 和 REG_BINARY.

在注册表中, REG_DWORD 值总是被转换为正十进制数. 如果数字是负数, 则使用 `OutputVar := OutputVar << 32 >> 32` 或类似的方法将其转换为有符号的 32 位整数.

读取 REG_BINARY 键时, 结果是一串十六进制字符. 例如, REG_BINARY 值 01,a9,ff,77 的读取结果为字符串 01A9FF77.

读取 REG_MULTI_SZ 值的每个部分会以换行符结束(`n). 如果值为空, 则返回空字符串. 从返回值中逐个提取单独的部分, use a parsing loop.

要检索和操作多个注册表键或值, 请考虑使用注册表循环.

有关如何访问远程计算机注册表的详情, 请参阅注册表循环中的备注.

从 32 位脚本中读取或写入注册表的 64 位部分中的条目, 反之亦然, 请使用 SetRegView.

## 相关

RegCreateKey, RegDelete, RegDeleteKey, RegWrite, 注册表循环, SetRegView, IniRead

## 示例

从注册表中读取一个值并将其存储在 TestValue.

    TestValue := RegRead("HKEY_LOCAL_MACHINE\Software\SomeApplication", "TestValue")

检索并报告 "Program Files"(程序文件) 目录的路径. 有关另一种方法, 请参阅 EnvGet 示例 #2.

    ; 此行确保在 64 位系统上运行非 64 位脚本时
    ; 也能正常返回 64 位的 Program Files 目录路径.
    SetRegView 64

    ProgramFilesDir := RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "ProgramFilesDir")
    MsgBox "Program files are in: " ProgramFilesDir

检索注册表值的类型(例如 REG_SZ 或 REG_DWORD).

    MsgBox RegKeyType("HKCU", "Environment", "TEMP")
    return

    RegKeyType(RootKey, SubKey, ValueName)  ; 此函数返回指定值的类型.
    {
        Loop Reg, RootKey "\" SubKey
            if (A_LoopRegName = ValueName)
                return A_LoopRegType
        return "Error"
    }

dftg