最近遇到一个奇怪的问题,ffi.Callback如果返回值是void *或者pointer时,能拿到指针地址,但是指针长度会为0的问题。因为返回为void *,但节点ffi不知道分配多长的缓冲区给它,所以就把length 给设置成0了?
看来返回指针的时候还得带上指针长度。
C++:
//初始化
EXPORTFUNC int testInit(callbackFunc logCallBack) ;
//回调函数声明 typedef void(*callbackFunc)(void *userdata);
Electron +Vue:
const ffi = window.require("ffi-napi"); const ref = window.require('ref-napi'); const iconvLite = window.require("iconv-lite");
const dll = new ffi.Library('resources/dll', { "testInit":['int',['pointer']], });
const SDKCallBack = ffi.Callback(ref.types.void,['pointer'],(p)=>{ let b = ref.readPointer(p.ref(),0,100);//因为拿不到长度,暂定100测试 let data = []; for(let i = 0 ;i < b.length;i++){ let d = b.readInt8(i) & 0xff; if(d == 0) break; data.push(d); } let buffer = Buffer.from(data); console.log(iconvLite.decode(buffer,"gbk")); });
dll.testInit(SDKCallBack);