You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Koffi在JS中正确调用Win x64 DLL的ABCD_Create函数?

正确调用Windows x64 DLL中ABCD_Create函数的Koffi实现

问题分析

你遇到的0xC0000005访问违例,核心原因是输出参数的指针传递不正确:要么传递了未初始化的无效指针,要么指针层级定义错误,导致DLL函数尝试写入非法内存区域。

正确的Koffi定义与调用方法

根据C语言的函数声明,ABCD_Create接收一个指向HNDL(即void*)的指针作为输出参数,返回DWORD类型的错误码。以下是两种可行的实现方式:

方式1:使用函数声明语法

const koffi = require('koffi');
// 加载目标DLL,替换为你的DLL路径
const lib = koffi.load('your_target.dll');

// 定义HNDL为不透明指针类型(无需解析内部结构)
const HNDL = koffi.opaque('HNDL');

// 定义函数:__stdcall对应WINAPI,_Out_标记输出参数
const ABCD_Create = lib.func('uint __stdcall ABCD_Create(_Out_ HNDL *pHandle)');

// 调用函数:用koffi.out()包装变量,让函数能写入返回的句柄
let hHandle = null;
const err = ABCD_Create(koffi.out(hHandle));

// 检查调用结果
if (err === 0) {
    console.log('句柄创建成功:', hHandle);
} else {
    console.error('创建失败,错误码:', err);
}

方式2:使用参数数组定义

const koffi = require('koffi');
const lib = koffi.load('your_target.dll');

const HNDL = koffi.opaque('HNDL');

// 用数组形式定义函数:函数名、返回值类型、参数列表(koffi.out标记输出)
const ABCD_Create = lib.func('ABCD_Create', 'uint', [koffi.out(koffi.pointer(HNDL))]);

// 调用逻辑与方式1一致
let hHandle = null;
const err = ABCD_Create(koffi.out(hHandle));

if (err === 0) {
    console.log('句柄创建成功:', hHandle);
}

你之前尝试的错误点解析

  1. 第一种尝试:let hHandle;未初始化,直接传递给函数相当于传递了undefined,对应无效指针,触发内存访问错误。必须用koffi.out()包装变量,确保传递有效的可写入指针地址。
  2. 第二种尝试:未明确标记输出参数,且调用时未正确传递可写入的指针,导致DLL函数无法正确写入返回值。
  3. 第三种尝试:koffi.pointer(Handle, 2)定义了双重指针(void***),但函数实际只需要HNDL*(void**),指针层级错误导致写入非法内存。

内容的提问来源于stack exchange,提问作者droland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:35:25