Union数据

Koffi 2.5 中的新功能

Union定义

您可以使用与结构类似的语法来声明Union,但使用函数koffi.union()。该函数有两个参数:第一个是类型的名称,第二个是包含Union成员名称和类型的对象。您可以省略第一个参数来声明匿名Union。

以下示例说明了如何使用 Koffi 在 C 和 JS 中声明相同的Union:

typedef union IntOrDouble {
    int64_t i;
    double d;
} IntOrDouble;
const IntOrDouble = koffi.union('IntOrDouble', {
    i: 'int64_t',
    d: 'double'
});

输入Union

将联合值传递给 C

您可以使用 实例化一个Union对象koffi.Union(type)。这将创建一个最多包含一个活动成员的特殊对象。

创建Union实例后,您可以简单地使用点运算符设置成员,就像使用基本对象一样。然后,只需将您的Union值传递给您想要的 C 函数即可。

为简单起见,Koffi 还接受带有一个属性(不多不少)设置相应Union成员的对象字面量。下面的示例使用它来简化上面显示的代码。

Win32 示例

以下示例使用SendInput Win32 API 发出 Win+D 快捷方式并隐藏窗口(显示桌面)。

输出Union

与Struct不同,Koffi 不知道哪个Union成员是有效的,并且无法自动对其进行解码。但是,您可以使用特殊koffi.Union对象作为输出参数,并在调用后对内存进行解码。

要解码输出Union指针参数,请创建一个占位符对象new koffi.Union(type)并将结果对象传递给函数。

调用之后,您可以在该对象上取消引用您想要的成员值,Koffi 此时将对其进行解码。

以下示例说明了如何koffi.Union()在调用后使用来解码输出Union。

Last updated