如何用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); }
你之前尝试的错误点解析
- 第一种尝试:
let hHandle;未初始化,直接传递给函数相当于传递了undefined,对应无效指针,触发内存访问错误。必须用koffi.out()包装变量,确保传递有效的可写入指针地址。 - 第二种尝试:未明确标记输出参数,且调用时未正确传递可写入的指针,导致DLL函数无法正确写入返回值。
- 第三种尝试:
koffi.pointer(Handle, 2)定义了双重指针(void***),但函数实际只需要HNDL*(void**),指针层级错误导致写入非法内存。
内容的提问来源于stack exchange,提问作者droland
相关产品推荐
相关产品推荐

