node-ffi 调用C++ dll Callback返回空缓冲区问题
Jr-ThrowsTired
2021年01月21日 18:49

最近遇到一个奇怪的问题,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&#​34;); const ref = window.require('ref-napi&#​39;); const iconvLite = window.require("iconv-lite&#​34;);

const dll = new ffi.Library('resources/dll&#​39;, { "testInit&#​34;:['int&#​39;,['pointer&#​39;]], });

const SDKCallBack = ffi.Callback(ref.types.void,['pointer&#​39;],(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&#​34;)); });

dll.testInit(SDKCallBack);