首先,node调用动态库需要使用node-ffi模块,其次就是各个dll接口的数据对应问题,最常用的有int,long ,bool,String,还有一些ref.refType()引用的类型,暂时没用到,有需要的可以自己找一下
我是从参考c#调用dll实现node调用的,首先c#对其中一个方法的引入是这样的
[DllImport("MsprintsdkRM.dll", EntryPoint = "PrintString", CharSet = CharSet.Ansi)]
public static extern unsafe int PrintString(StringBuilder strData);
看完后,果断的使用sting替换了stringbuilder,node中的实现是这样的
const ffi = require('ffi-napi')
const path = require('path')
let dllPath = path.resolve('dll/print')
const dll = ffi.Library(dllPath + '/MsprintsdkRM.dll', {
PrintString: ['int', ['String']],
});
调用时这样的:
dll.PrintString(“测试打印测试打印”);
然后进行了测试,发现打印出来的文字竟然是乱码的,经过度娘和大佬们的帮助才知道:
默认node.js是utf8字符串,而我们的dll很多都是gbk编码,从参数的传入需要转成gbk
转码一般用这个模块,纯js版本 (中文 传入参数需要转码成gbk ,传出参数需要转码成utf8)
能怎么样呢,改吧
var iconv = require ( 'iconv-lite' );
dll.PrintString(iconv.encode(“测试打印测试打印”,'GBK'));
然后就可以了
此博客仅用于自己错误记录,也希望帮助到和我一样困惑的小伙伴