历史版本

预计阅读时间: 26 分钟

该页面不添加跳转链接,如有需要,请参考 koffi 的 ChangeLog 页面,

源文档 - Changelog

版本历史

记录

请参阅迁移指南,在主要 Koffi 版本之间进行迁移。

Koffi 2

Koffi 2.12

Koffi 2.12.2

发布于 2025-07-16

  • 验证标识符是否符合 Unicode XID 表
  • 跳过结构体和联合体成员中名为 '_' 的占位符
  • 为 Linux (musl) ARM64 添加 Koffi 预构建版本

Koffi 3 的代码库已被搁置,其部分功能将在未来几个月逐步整合到 Koffi 2 中。

Koffi 2.12.1

发布于 2025-07-05

  • 修复在强制转换函数指针时的类型错误

Koffi 2.12.0

发布于 2025-06-19

  • 支持 LoongArch64 架构(感谢 wjh-la)
  • 修复 RISC-V 64 预构建版本的路径错误

Koffi 2.11

Koffi 2.11.0

发布于 2025-04-09

  • 添加 koffi.view(),用于无复制访问内存
  • 修复和改进了各种文档

Koffi 2.10

Koffi 2.10.1

发布于 2025-01-24

  • 修复在某些情况下构建脚本中 ARM32 的检测问题
  • 修复 ARM32 预构建版本的路径错误

Koffi 2.10.0

发布于 2024-12-22

  • 允许将不透明类型重新定义为具体的结构体或联合体
  • 从 ELF 目标中清除可执行堆栈位(-z noexecstack
  • 更新文档风格

Koffi 2.9

Koffi 2.9.2

发布于 2024-11-08

  • 修复在推送 UTF-16 和 UTF-32 字符串参数时的非对齐指针问题
  • 修复和改进了各种文档

Koffi 2.9.1

发布于 2024-09-23

  • 修复 2.9.0 中 x86 32 位支持的回归问题
  • 添加缺失的 koffi.alloc() 的 TS 定义
  • 在 TS 定义文件中支持 koffi.load(null)

Koffi 2.9.0

发布于 2024-07-22

  • 添加对 char32t 和 wchart(宽)字符串的支持
  • 包含基于 Alpine 的 Linux/musl x64 预构建版本

Koffi 2.8

Koffi 2.8.11

发布于 2024-06-19

  • 修复 Visual Studio 17.10 引入的 MSVC 编译器错误

Koffi 2.8.10 在没有预构建二进制文件的平台上无法使用,请跳过此版本。

Koffi 2.8.9

发布于 2024-05-17

  • 修复 x86_64(以及其他可能的平台)上 bool 返回值的 ABI 问题

Koffi 2.8.8

发布于 2024-04-26

  • 支持使用大小不匹配的缓冲区(截断或零填充)

Koffi 2.8.7

发布于 2024-04-23

  • 提高在 Windows 上与 SEHOP 的兼容性(@longhun12346)

Koffi 2.8.6

发布于 2024-04-12

  • 在支持的平台上支持使用 RTLD_DEEPBIND 加载库

Koffi 2.8.5

发布于 2024-04-11

  • 防止明显无效的类型和成员名称
  • 修复在 POSIX 系统上 koffi.load() 错误时可能的无限循环/未定义行为
  • 修复在 Windows 上 koffi.load() 的某些错误时返回空值而不是异常

Koffi 2.8.4

发布于 2024-04-09

  • 为 Node 20.12+ 和 21.6+ 使用更简单的解决方法以避免过度内存使用

Koffi 2.8.3 缺少一些预构建二进制文件,请跳过此版本。

Koffi 2.8.2

发布于 2024-04-07

  • 在 POSIX 平台上支持使用 RTLD_GLOBAL 加载库

Koffi 2.8.1

发布于 2024-04-04

  • 修复与 Node 20.12+ 和 21.6+ 的不兼容性

Koffi 2.8.0

发布于 2024-02-12

  • 支持推送字符串参数的指针
  • 添加 koffi.alloc() 以提供稳定的指针

Koffi 2.7

Koffi 2.7.4

发布于 2024-02-04

  • 支持在主线程上但不在 JS 调用中发生的回调(例如在事件循环期间)
  • 提高 koffi.reset() 后的稳定性
  • 暴露内部 Node/NAPI env 指针
  • 命名主要的 Koffi API 函数

Koffi 2.7.3

发布于 2024-01-26

  • 支持解码以 NULL 结尾的数组

Koffi 2.7.2

发布于 2024-01-15

  • 添加缺失的 koffi.free() 的 TypeScript 声明
  • 修复 koffi.encode() 的 TypeScript 声明
  • 尝试提高与 webpack 的兼容性

Koffi 2.7.1

发布于 2024-01-02

  • 支持类似 C 的 int[3] 语法用于固定数组类型
  • 拒绝以无效标记结尾的类型说明符(以前会忽略)

Koffi 2.7.0

发布于 2023-12-21

  • 支持经典语法中的替代回调调用约定
  • 改变经典语法中调用约定的语法
  • 从 Koffi 中移除未使用的 "internal" 属性

Koffi 2.6

Koffi 2.6.12

发布于 2023-12-11

  • 修复在 Koffi 2.6.11 中引入的可能崩溃问题

Koffi 2.6.11

发布于 2023-12-05

  • 加快解析简单且常用类型名称的速度
  • 修复在使用 koffi.encode() 时可选长度参数的使用问题

Koffi 2.6.10

发布于 2023-11-29

  • 在 Windows 上保护 Node.js 和 V8 的 GetLastError() 值

Koffi 2.6.9

发布于 2023-11-25

  • 在 Windows 上在 DLL 目录中搜索额外的依赖项
  • 在创建结构体或联合体时忽略原型属性
  • 在 Node 版本不适用时显示检测到的版本
  • 修复了一些文档中的小问题

Koffi 2.6.8 加载 Win32 系统库可能会失败,请跳过此版本。

Koffi 2.6.6

发布于 2023-10-28

  • 更好地处理创建结构体或联合体类型时的错误

Koffi 2.6.5

发布于 2023-10-28

  • 支持自引用结构体和联合体
  • 修复与某些无效类型说明符相关的罕见 Node.js "FATAL ERROR"

Koffi 2.6.4

发布于 2023-10-26

  • 修复与最新 Visual Studio 版本相关的构建问题

Koffi 2.6.3

发布于 2023-10-17

  • 添加间接加载脚本以帮助某些打包工具

Koffi 2.6.2 的预构建二进制文件无法正确工作,请跳过此版本。

Koffi 2.6.1

发布于 2023-09-18

  • 支持在经典函数定义中使用字符串方向限定符
  • 修复在解析类型名称时可能的越界数组访问问题

Koffi 2.6.0

发布于 2023-09-13

新功能:

  • 使用 koffi.symbol() 创建指向导出变量(或其他符号)的指针
  • 使用 koffi.encode() 显式地将数据从 JS 编码到 C 内存
  • 在 POSIX 平台上使用共享库懒加载(RTLD_LAZY)

其他更改:

  • 为 Win32/Win64 DLL 不匹配打印更有帮助的错误信息
  • 在 TS 定义文件中添加缺失的 "Union" 基本值

Koffi 2.5

Koffi 2.5.20

发布于 2023-08-31

  • 修复在 Koffi 2.5.19 中引入的可能崩溃问题(与异步注册回调相关)
  • 修复和改进了各种文档

Koffi 2.5.19

发布于 2023-08-29

  • 懒惰地创建线程安全的函数代理
  • 添加 koffi.reset() 用于类型名称和异步代理

Koffi 2.5.18

发布于 2023-08-27

  • 修复与 Electron 的兼容性问题

Koffi 2.5.16

发布于 2023-08-25

  • 通过常规 index.js 入口点运行 Koffi 测试
  • 修复在 Windows 上从 NW.js 使用 Koffi 时的 DLL 错误
  • 简化 NW.js 的 Koffi 示例

Koffi 2.5.13 到 2.5.15 的预构建二进制文件无法正确工作,请跳过这些版本。

Koffi 2.5.12

发布于 2023-08-21

  • 修复 FreeBSD ARM64 和 Linux RISC-V 64 的原生模块打包问题
  • 将最大参数数量增加到 64

Koffi 2.5.11

发布于 2023-08-03

  • 支持使用 koffi.as() 铸造函数指针
  • 以 C++20 模式构建

Koffi 2.5.10

发布于 2023-08-01

  • 修复当客户端必须构建 Koffi 时的 CMake 回退问题

Koffi 2.5.9

发布于 2023-07-28

主要更改:

  • 在 Koffi 中使用打包工具友好的静态 require 调用
  • 在文档中添加打包示例

其他更改:

  • 在 TS 文件中添加缺失的 unload() 导出
  • 在 TS 文件中添加 koffi.types 的导出

Koffi 2.5.8

发布于 2023-07-26

  • 为原生 Koffi 模块添加更多搜索路径
  • 在文档中添加关于打包的部分

Koffi 2.5.7

发布于 2023-07-19

  • 将包指向新的仓库

Koffi 2.5.6

发布于 2023-07-19

  • 将输出参数的最大限制从 16 增加到 32

Koffi 2.5.5

发布于 2023-07-17

  • 支持解码非字符以 NULL 结尾的数组

Koffi 2.5.4

发布于 2023-07-14

  • 修复 koffi.pointer() 不接受可释放类型的问题
  • 修复创建匿名类型指针时可能存在的问题

Koffi 2.5.3

发布于 2023-07-05

  • 在 TS 定义文件中添加缺失的联合导出
  • 修复 TS 定义文件中的一些参数名称

Koffi 2.5.2

发布于 2023-07-04

  • 默认初始化未设置的对象/结构体成员

Koffi 2.5.1

发布于 2023-06-20

  • 修复在 System V 64 ABI 中某些结构体类型的崩溃问题
  • 始终对缓冲区参数使用直接传递

Koffi 2.5.0

发布于 2023-06-20

新功能:

  • 支持联合体类型

其他修复:

  • 修复在 i386 BSD 系统上单精度聚合返回的 ABI 问题
  • 在 POSIX 系统上不要干扰 Node.js 的信号处理

Koffi 2.4

Koffi 2.4.2

发布于 2023-06-04

  • 支持调用可变参数函数指针
  • 为函数指针添加文档

Koffi 2.4.1

发布于 2023-06-03

主要更改:

  • 支持解码函数指针为可调用函数
  • 支持使用 koffi.call() 调用函数指针
  • 弃用 koffi.callback,推荐使用 koffi.proto

其他更改:

  • 将最大回调数量增加到 8192
  • 在 Windows 上以静态 CRT 构建 Koffi
  • 重新组织 Koffi 数据转换文档
  • 在 TS 文件中添加已弃用的 koffi.handle

Koffi 2.3

Koffi 2.3.20

发布于 2023-05-15

  • 支持使用 lib.unload() 显式卸载库

Koffi 2.3.19

发布于 2023-04-21

  • 确实允许 [string] 值用于 void * 参数(非模糊)

Koffi 2.3.18

发布于 2023-04-21

  • 修复由未注册回调导致的退出时可能的崩溃问题

Koffi 2.3.17

发布于 2023-04-20

  • 允许字符串用于输入 void *int8_t *int16_t * 指针参数
  • 支持使用 [string](单元素字符串数组)作为多态输入/输出参数

Koffi 2.3.16

发布于 2023-04-11

  • 修复 Windows ARM64 构建以支持官方 Node.js 版本
  • 使用 Visual Studio 2022 17.5.3 编译 Windows 构建
  • koffi.free()koffi.address() 中支持 null

Koffi 2.3.15

发布于 2023-04-10

  • 改进手动解码以 NULL 结尾的字符串
  • 添加围绕数组转换提示的检查

Koffi 2.3.14

发布于 2023-04-05

  • 添加 koffi.errno() 函数以获取和设置当前的 errno 值
  • 添加包含有效 errno 代码的 koffi.os.errno 对象

Koffi 2.3.13

发布于 2023-03-30

  • 添加 koffi.address() 以获取包装指针的原始值

Koffi 2.3.12

发布于 2023-03-30

  • 修复 TS 定义文件中的错误语法
  • 在 TS 文件中添加缺失的导出属性

Koffi 2.3.11

发布于 2023-03-30

主要更改:

  • 允许使用数字和 BigInt 作为指针参数

其他更改:

  • 在 SQLite 测试代码中使用 SQLITE_TRANSIENT
  • 避免使用 statx() 以允许在 glibc < 2.28 下编译
  • 重新组织 NPM 包文件以减少复杂性

Koffi 2.3.9

发布于 2023-03-10

  • 在 MIT 许可下重新授权

Koffi 2.3.8

发布于 2023-02-28

  • 禁用尚未准备好的联合体支持
  • 简化 Windows 栈分配并移除 NOACCESS 和 GUARD 页面
  • 调整 Windows TEB SEH 链和 GuaranteedStackBytes 以适应 Koffi 调用

Koffi 2.3.7

发布于 2023-02-27

  • 修复 index.js 中缺失的 require(@gastonFrecceroNapse)
  • 减少 NPM 包膨胀(从 65 MB 减少到 20 MB),这是由于 2.3.6 中的更改导致的

Koffi 2.3.6

发布于 2023-02-26

  • 修复损坏的 TS 定义文件
  • 在运行时保留所有预构建二进制文件并加载正确的文件

Koffi 2.3.5

发布于 2023-02-24

主要修复:

  • 修复与异步回调相关的罕见随机崩溃
  • 修复 RISC-V 64 ABI 的一些错误

其他更改:

  • koffi.introspect() 中暴露数组类型提示
  • 在 TS 定义中添加缺失的 koffi.array() 导出
  • 在 TS 定义中使 KoffiFunction 更灵活(@insraq)
  • 在 TS 类型定义中添加 KoffiFunc 辅助类型(@insraq)
  • 在 TS TypeInfo 类中标记可选属性
  • 进行了一些性能改进

Koffi 2.3.4

发布于 2023-01-31

  • 修复在 Windows 上安装 Koffi 时的错误(2.3.2)

Koffi 2.3.2

发布于 2023-01-30

主要更改:

  • 修复类型解析器问题(例如忽略一些可释放限定符)
  • 修复在输出参数中使用可释放类型时的崩溃问题
  • 添加基本的 koffi.stats() 接口

其他更改:

  • 避免依赖 CNoke
  • 从 package.json 中清除开发依赖

Koffi 2.3.1

发布于 2023-01-30

  • 当尝试使用模糊的 void * 参数(输入和/或输出)时抛出错误
  • 调整 TypeScript 定义(@insraq)
  • 修复解析无效原型时可能的崩溃问题

Koffi 2.3.0

发布于 2023-01-25

主要更改:

  • 允许使用缓冲区(TypedArray 或 ArrayBuffer)值作为输入和/或输出指针参数(用于多态参数)
  • koffi.decode() 中支持不透明缓冲区(TypedArray 或 ArrayBuffer)值以解码输出缓冲区
  • 当向 koffi.decode() 传递明确的长度时,将非字符串类型解码为数组

其他更改:

  • 停用 TypedArray 类型检查以用于数组和指针值(仅大小重要)
  • 在支持 TypedArray 的地方允许使用 ArrayBuffer
  • 为 Koffi 添加 TypeScript 定义(@insraq)
  • 改进关于不透明和多态结构体的文档
  • 改进 koffi.decode() 的文档
  • 通过移除测试代码和依赖项,将 NPM 包大小从 100 MB 减少到 25 MB

Koffi 2.2

Koffi 2.2.5

发布于 2023-01-23

  • 在 LGPL 3.0 许可下重新授权 Koffi

Koffi 2.2.4

发布于 2023-01-19

  • 修复在 Windows 上运行许多异步调用时的内存泄漏问题(Koffi 2.2.3)
  • 重新组织文档页面

Koffi 2.2.3

发布于 2023-01-17

  • 支持在 Windows(x86、x64 和 ARM64)上使用结构化异常处理(SEH)的原生代码
  • 尝试在 x86/x64 汇编代码中使用 ebp/rbp 作为帧指针

Koffi 2.2.2

发布于 2023-01-14

主要修复:

  • 支持透明的异步回调
  • 将最大回调数量从 16+16 扩展到 1024,允许并行运行

其他修复:

  • 通过移除 index.js 中的 shebang 改进打包支持
  • 修复在同一个进程中多次加载 Koffi 时的错误(上下文感知模块)
  • 在加载模块时检查 N-API 版本
  • 优化回调注销

Koffi 2.2.1

发布于 2022-12-21

  • 修复在 FFI 调用内的回调再次被调用时的崩溃问题

Koffi 2.2.0

发布于 2022-12-20

新功能:

  • 为回调指针参数添加 koffi.decode()
  • 支持透明的输出字符串参数
  • 添加 koffi.offsetof() 工具函数
  • koffi.register() 中支持可选的 _this 绑定

其他修复:

  • 正确验证输出参数类型
  • 修复与 void * 参数相关的断言问题

Koffi 2.1

Koffi 2.1.5

发布于 2022-11-27

  • 将缺失的 README 文件添加到 NPM 包中

Koffi 2.1.4

发布于 2022-11-25

主要更改:

  • 将最大类型大小从 32 KiB 增加到 64 MiB
  • 添加最大类型大小的可配置选项

其他更改:

Koffi 2.1.3

发布于 2022-10-31

  • 支持最多 16 个输出参数(之前为 8 个)

Koffi 2.1.2

发布于 2022-10-31

  • 支持最多 8 个输出参数(之前为 4 个)

Koffi 2.1.1

发布于 2022-08-16

  • 修复潜在的内存分配错误

Koffi 2.1.0

发布于 2022-08-13

主要更改:

  • 添加 koffi.as() 以支持基于 void * 参数的多态 API
  • 添加大小端敏感的整数类型:intX_le_tintX_be_tuintX_le_tuintX_be_t
  • 接受 TypedArray 作为 void * 参数
  • 引入 koffi.opaque() 以替换 koffi.handle()(后者将在 Koffi 3.0 中被移除)
  • 支持使用 JS Array 和 TypedArray 填充结构体和数组指针成员

其他更改:

  • 通过内联和统一构建提高整体性能
  • 添加 size_t 基本类型
  • 在结构体中支持成员特定的对齐值
  • 检测不可能的参数和返回类型(例如非指针不透明类型)
  • 修复和改进了各种文档

Koffi 2.0

Koffi 2.0.1

发布于 2022-07-30

  • 对于 void 函数,返回 undefined(而不是 null)

Koffi 2.0.0

发布于 2022-07-29

主要新功能:

  • 添加可释放类型以自动处理 C 值(例如堆分配的字符串)
  • 添加对注册回调的支持,这些回调可以在初始 FFI 调用后被调用
  • 支持命名指针类型
  • 支持在原型解析器之外的复杂类型规范

次要新功能:

  • 支持使用 koffi.alias() 的类型别名
  • 添加 koffi.resolve() 以解析类型字符串
  • koffi.types 中公开所有原始类型别名
  • 正确传递在 JS 回调中抛出的异常

破坏性 API 更改:

  • 更改回调类型的处理方式,必须通过指针使用
  • 更改不透明句柄的处理方式,必须通过指针使用
  • koffi.introspect(type) 中支持所有类型

更多详细信息请参阅迁移指南。

Koffi 1

Koffi 1.3

Koffi 1.3.12

发布于 2022-07-27

  • 修复对 Yarn 包管理器的支持

Koffi 1.3.11

发布于 2022-07-26

  • 修复当 void * 用于第一个参数时的解析错误

Koffi 1.3.10

发布于 2022-07-25

主要修复:

  • 修复在 Windows x64 上支持超过 4 个参数的回调
  • 修复在 ARM32 平台上支持多个浮点参数的回调
  • 修复可能不正确的 uint32_t 回调参数转换

其他更改:

  • 修复和改进了各种文档

Koffi 1.3.9

发布于 2022-07-15

  • 修复在 Windows x64 上与 Electron 的预构建兼容性

Koffi 1.3.8

发布于 2022-07-12

主要更改:

  • 防止在 FFI 调用之外重用回调
  • 为 AAarch64 平台(除 Windows 外)添加 BTI 支持

其他更改:

  • 修复并统一了一些错误消息

Koffi 1.3.7

发布于 2022-07-07

主要修复:

  • 修复在结构体中使用回调时的崩溃问题
  • 支持记录成员中的空字符串

其他更改:

  • 添加 intptrt 和 uintptrt 原始类型
  • 添加 str/str16 类型别名用于 string/string16
  • 修复和改进了各种文档

Koffi 1.3.6

发布于 2022-07-01

主要修复:

  • 修复在 Node < 15 的 Windows 上的安装错误(构建系统错误)

其他更改:

  • 在安装 Koffi 时检测不兼容的 Node.js 版本
  • 使用 Clang 为 Windows x64 和 Linux x64 二进制文件进行预构建
  • 修复和改进了各种文档

Koffi 1.3.5

发布于 2022-06-25

主要更改:

  • 修复在运行许多异步调用时的内存泄漏
  • 添加异步调用最大数量的可配置限制(maxasynccalls)

其他更改:

  • 减少默认的异步内存栈和堆大小
  • 修复和改进了各种文档

Koffi 1.3.4

发布于 2022-06-24

  • 修复在 OpenBSD i386 上可能的 (void) 函数崩溃问题

Koffi 1.3.3

发布于 2022-06-24

主要修复:

  • 修复将有符号整数返回值错误地转换为无符号数的问题

其他更改:

  • 支持 (void)(空)函数签名
  • 禁用不安全的编译器优化
  • 修复和改进了各种文档

Koffi 1.3.2

发布于 2022-06-23

  • 支持在 C++14 模式下编译(优雅降级)
  • 支持 Linux 上的旧工具链(已在 Debian 9 上测试)

Koffi 1.3.1

发布于 2022-06-22

  • 在安装 Koffi 时测试预构建二进制文件,如果加载失败则重新构建

Koffi 1.3.0

发布于 2022-06-22

主要更改:

  • 扩展并迁移文档至 https://koffi.dev/
  • 支持 JS 数组和 TypedArrays 作为指针参数(输入、输出和混合)

其他更改:

  • 将 NULL 字符串指针转换为 null 以避免崩溃(返回值、结构体和数组成员、回调)
  • 为 char、char16 和 char16_t 数组默认使用 "string" 数组提示
  • 修复 Windows x64 上 long 类型的定义(LLP64 模型)
  • 限制自动字符串转换为有符号 char 类型
  • 在使用预构建二进制文件之前检测浮点 ABI(ARM32、RISC-V)
  • 禁止结构体类型中的重复成员名称

Koffi 1.2

Koffi 1.2.4

发布于 2022-06-12

  • 现在支持 Windows ARM64

Koffi 1.2.3

发布于 2022-06-11

  • 现在包含 macOS ARM64(M1)的预构建二进制文件

Koffi 1.2.1

发布于 2022-06-11

此条目记录了自版本 1.1.0 以来的更改。

新功能:

  • 在所有平台上,JS 函数可以用作 C 回调(cdecl、stdcall)
  • 支持 RISC-V 64 LP64D ABI(LP64 未经测试)
  • 暴露同步和异步调用内存使用的设置
  • 在 C 缓冲区和字符串之间透明转换
  • 初步支持 Windows ARM64(未经测试)

主要修复:

  • 修复 x86 平台上结构体的过度栈对齐问题
  • 修复与大 int64t/uint64t 值相关的潜在问题
  • 修复推送/弹出代码中可能的结构体布局错误
  • 修复 ARM32 推送代码中的对齐问题
  • 修复 ARM32 和 ARM64 上 HFA 结构体的不完整/错误支持
  • 修复由缺少 MAP_STACK 标志导致的 OpenBSD 崩溃问题
  • 修复无意义的 "重复数组类型" 错误
  • 修复模块(正常)构建中 koffi.internal 的值为 false
  • 确保所有架构的堆栈下方都有一个红区
  • 对于大对象使用更慢的分配方式而不是失败

待办事项

以下功能和改进计划中,不一定按此顺序进行:

  • 将 Koffi 移植到 Loong64 ISA 和 ABI
  • 将 Koffi 移植到 PowerPC(POWER9+)ISA 和 ABI
  • 优化结构体和数组的传递(通过自动生成的 JS)
  • 自动化 Windows/AArch64(qemu)和 macOS/AArch64(如何实现……谢谢苹果)测试
  • 创建一个使用多个库(Raylib、SQLite、libsodium)的实际示例,以展示各种 C API 风格
  • 添加简单的结构体类型解析器
  • 修复汇编反向跟踪和 CFI 指令,以获得更好的调试体验