NumPut

将一个或多个数字以二进制格式存储到指定地址+偏移的位置.

NumPut Type, Number, Type2, Number2, ... Target , Offset

参数

Type

类型: 字符串

下列字符串的其中一个: UInt, UInt64, Int, Int64, Short, UShort, Char, UChar, Double, Float, Ptr 或 UPtr

对于所有整数类型, 或者在传递纯整数时, 有符号与无符号并不影响结果, 因为使用了二进制补码来表示有符号整数.

有关详情, 请参阅 DllCall 类型.

Number

类型: 整数

要保存的数字.

Target

类型: 对象整数

缓冲对象, 内存地址.

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

Offset

类型: 整数

如果省略, 默认为 0. 否则, 请指定一个单位为字节的偏移, 将其加到 Target 以确定目标地址.

返回值

类型: 整数

函数返回最后写入项目右边的地址. 这在写入一个不连续的数字序列时, 例如在 DllCall 中使用的结构, 某些字段未被设置时, 就可以使用这个函数. 但是, 在许多情况下, 指定多个 Type, Number 对更简单有效. 将地址传回 NumPut 比传给一个更新了 Offset 的类 Buffer 对象更不安全.

一般说明

可以在第一个 Number 之后, 通过重复任意次数的 TypeNumber 来写入数字序列. 每个数字都写入前一个数字之后的下一个字节, 不带填充. 创建用于 DllCall 的结构时, 请注意, 由于数据对齐要求, 某些字段可能需要添加显式填充.

如果整数太大而无法放入指定的 Type, 那么它的高位会被忽略; 例如 NumPut("Char", 257, buf) 将存储数字 1.

如果目标地址无效, 则可能抛出异常. 但是, 一些无效地址不能被检测到, 并可能导致不可预知的行为. 传递缓冲对象而不是地址可以确保目标地址总是可以得到验证.

NumGet, DllCall, Buffer 对象, VarSetStrCapacity