# StrGet

从内存地址或缓冲中复制字符串, 可选地从给定的代码页进行转换.

    String := StrGet(Source , Length, Encoding)
    String := StrGet(Source , Encoding)

## 参数

Source

  类型: 对象或整数

  包含字符串的类缓冲对象, 或字符串的内存地址.

  可以使用任何实现 Ptr 和 Size 属性的对象, 但此函数针对原生的缓冲对象进行了优化. 传递具有这些属性的对象可确保函数不会从无效位置读取内存; 这样做可能会导致崩溃或其他不可预测的行为.

  如果提供了类缓冲对象, 或者如果指定了 Length, 则字符串不需要以空终止符结尾.

Length

  类型: 整数

  如果未设置或省略(或使用 2 参数模式时), 则默认为字符串的当前长度, 前提是字符串以空终止符结尾. 否则, 请指定需读取的最大字符数.

  默认情况下, 只复制到第一个二进制零. 如果 Length 为负数, 则它的绝对值指示要转换的确切字符数, 包括字符串可能包含的任何二进制零 - 换句话说, 结果始终是具有该长度的字符串.

  注意: 如果字符串不是以空终止符结尾的, 则保留 Length 未指定可能会造成访问冲突, 从而导致程序终止或其他一些不希望的结果. 指定不正确的长度可能会产生意外的行为.

Encoding

  类型: 字符串

  如果未设置或省略, 那么将简单地复制字符串, 而不进行任何转换. 否则, 请指定源编码; 例如, `"UTF-8"`, `"UTF-16"` 或 `"CP936"`. 对于数字标识符, 只有在 3 参数模式中, 才可以省略前缀 "CP". 指定空字符串或 `"CP0"` 则使用系统默认 ANSI 代码页.

## 返回值

类型: 字符串

函数返回复制或转换后的字符串. 如果正确地指定了源编码, 则返回值总是使用原生编码. 它总是以空终止符终止, 但是空终止符不包括在返回值的 length 中, 除非 Length 为负数, 如前所述.

## 错误处理

如果检测到无效参数, 则抛出 ValueError.

如果转换无法执行, 则抛出 OSError.

## 备注

注意, 返回值总是使用当前可执行文件的原生编码, 而 Encoding 指定如何解释从给定 Source 读取的字符串. 如果没有指定 Encoding, 只复制字符串而不进行任何转换.

换句话说, StrGet 用于从内存地址或缓冲检索文本, 或者将其转换为脚本可以接受的格式.

如果需要在代码页之间进行转换, 返回值的长度可能与源字符串的长度不同.

## 相关

字符编码, StrPut, 二进制兼容性, FileEncoding, DllCall, 缓冲对象, VarSetCapacity

## 示例

Length 或 Encoding 都可以直接在 Source 后面指定, 但在这种情况下 Encoding 必须是非数字的.

    str := StrGet(address, "cp0")  ; 代码页 0, 未指定长度
    str := StrGet(address, n, 0)   ; 最大 n 字符, 代码页 0
    str := StrGet(address, 0)      ; 最大 0 字符(始终为空)

dftg