前言
最近又一个项目,需要用到electron调用dll文件,经过多方查阅,最终选用了ffi-napi这个库进行调用,至于如何使用此库不过多叙述。
中文BUG
本次调用Dll的过程中,因为dll返回ascii编码,正常调用方式一直乱码,iconv-lite这个库我也用了,但是还是没有效果。
并且根据 掘金大佬写的这个文章 得知
中文的占用字节比英文大,虽然我用python写的样例并没有出现此问题。
后经多方查阅,发现ffi可以自定义类型。参考文档
根据文章我尝试自己定义了一个类型,但是此时我还是有点弄不明白下面代码中的 indirection 的含义。我自己理解为库自动处理数据文件。
indirection是1的时候,自动处理,不是1的时候,不自动处理。
定义一个超大的size来储存数据。
let len = ref.sizeof.pointer * 1000;
let chinese = {
name: 'chinese',
indirection: 2,
size: len,
};
下面直接贴代码
let arr = []
let len = ref.sizeof.pointer * 1000;
let chinese = {
name: 'chinese',
indirection: 2,
size: len,
};
// 读取信息回调
let addCallback = ffi.Callback('void', [chinese, ref.types.int32,ref.types.int32], (item, index,c) => {
// console.log(item,index,c);
let s = []
let data;
for(let i=0; i<len ; i++ ){
// console.log( item[i])
s.push(item[i])
data = iconv.decode(s, 'GBK')
if(data.includes('\0\x00')){
break
}
}
// 最后一位为 \x00 ,需要截取掉
data = data.slice(0, data.length - 1)
arr.push(JSON.parse(data))
});
dll.rtscaleUploadPluData(0,addCallback);
console.log(arr)
虽然到现在,成功解决了此问题,但是我还是感觉这个实现方式不太对,也没弄明白。欢迎各位大佬批评指正。