StrGet() [AHK_L 46+]

从内存地址复制字符串, 可选地将其从给定的代码页转换为可识别的字符串.

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

参数

Source

字符串的内存地址.

如果指定了 Length, 则字符串不需要以空终止符结尾.

Length

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

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

注意: 不支持嵌入的空终止符, 这通常会导致字符串的截断.

Encoding

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

返回值

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

错误处理

如果检测到无效参数或转换无法执行, 则返回空字符串.

备注

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

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

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

字符编码, StrPut(), 脚本兼容性, FileEncoding, DllCall(), VarSetCapacity()

示例

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

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