最近遇到一个奇怪的问题,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);