下面来至https://blog.csdn.net/cut001/article/details/69397022的方法
FUNCTION ulong DesEnCodeHex(string str, string key, ref string outstr) library “zm_2007.dll”

int DesEnCodeHex(const char* str,const char* key, char* outstr) ; //c 接口描述 字符指针传出

function long LIV_open(long vender,long index,ref long handle) library “living1.dll”

int LIV_open(int vender,int index, int* handle);c 接口描述 整形指针传出。

function long LIV_get_hardware_info(long handle, ref LIV_hardware_info info) library “living1.dll”

int LIV_get_hardware_info(int handle,LIV_hardware_info info); //结构体指针传出

node.js调用动态库,采用node-ffi 模块。

var FFI = require(‘ffi’);
var ref = require(‘ref’);
var Struct = require(‘ref-struct’);
var refArray = require(‘ref-array’);
1、根据参数类型声明函数。
char* => string //也可以直接用 char *
int* => ref.refType(‘int’) //也可以直接用 int *
struct *=>ref.refType(liv_hardware_info)
struct[] *=> ref.refType(liv_hardware_info,3) //结构体数组
VOID * => ref.refType(‘pointer’)

结构体中的参数:
char* [] => refArray(‘byte’, 8)
基本类型
基本类型已经定义在了ref.types里,可以直接使用类型字符串或者’ref.types’中的类型对象。而对于枚举类型,简单当作int或者uint处理就可以了。

指针
对于指针类型,简单类型可以直接在参数列表里写int *,pointer这样的,生成类型的指针可以用ref.refType(type)。在调用函数时,执行var vRef = ref.alloc(type)得到一个引用对象,将对象传入函数即可。需要获取vRef指向的值v可以用var v = ref.deref(vRef)。对字符串类型的buffer可能需要使用ref.readCString(buffer)来读取(它可以处理末尾的’\0’)。

var intPtr = ref.refType(‘int’);
var liv_hardware_info = Struct({
‘developernumber’: ‘int’,
‘serialnumber’: refArray(‘byte’, 8),
‘manufacturedate’: ‘int’
});

let zm2007 = new FFI.Library(“./dll/zm_2007.dll”, {
‘DesEnCodeHex’: [‘int’, [‘string’, ‘string’, ‘string’]],
‘DesDeCodeHex’: [‘int’, [‘string’, ‘string’, ‘string’]],
‘LIV_open’: [‘int’, [‘int’, ‘int’, intPtr]],
‘LIV_get_hardware_info’: [‘int’, [‘int’, ref.refType(liv_hardware_info)]]
});
2、调用方法

var handleRef = ref.alloc(‘int’);//预先分配int 指针空间
let li_rtn = zm2007.LIV_open(0, 0, handleRef)
ll_handle = handleRef.deref();//获取int值

var lt = new Buffer(512).fill(" ");
zm2007.DesEnCodeHex(st, '770814', lt);
let ls_out = lt.toString("ascii"); //buffer中即为传出参数

var liv_info = new liv_hardware_info();//结构体初始化
zm2007.LIV_get_hardware_info(ll_handle, liv_info.ref());//调用
const buf = Buffer.from(liv_info.serialnumber); //获取已生成结构体中属性数据。

补充一点:字符集引起的中文乱码问题
默认node.js是utf8字符串,而我们的dll很多都是gbk编码,从参数的传入需要转成gbk
转码一般用这个模块,纯js版本
var iconv = require(‘iconv-lite’);

var infoRef = new Buffer(512);//调用函数预先分配空间
//开始调用。infoRef中是dll返回的gbk 数据串。

var as_data = iconv.decode(infoRef, ‘GBK’);//解码成utf8.

var userbuffer = iconv.encode(as_data, ‘gbk’);//utf8数据编码成gbk

总结: 中文 传入参数需要转码成gbk ,传出参数需要转码成utf8.

先记录,后面再加入内存直接映射的方法。

关于node.js和C交互的方法相关推荐

  1. Node.js的用户交互(使用readline模块)

    Node.js的用户交互(使用readline模块) 内容来源:https://www.jianshu.com/p/b761111eef72 在程序运行时可以使用键盘对程序进行控制,就像使用shell ...

  2. vue+node.js前后端交互中的token令牌验证

    这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得 最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js 在做用户登录的时候就想到 如 ...

  3. node.js取参四种方法req.body,req.params,req.param,req.body

    node.js取参四种方法req.body,req.params,req.param,req.body 参考:https://my.oschina.net/u/2519530/blog/535309 ...

  4. node.js中的url.parse方法

    学习node.js中的url.parse方法 文章目录 前言 一.URL模块之parse方法详解 1.参数 2.实例 例子1:url.parse只传一个参数的情况 例子2:url.parse第二个参数 ...

  5. Ajax+Node.js前后端交互最佳入门实践(01)

    1.Node.js简介 1.0.前后台数据交互流程 在web开发中,我们经常听说前端和后台,他们分别是做什么具体工作的呢?他们怎样交互的呢?我们得把这些基础的问题都搞明白了,才有一个大致的学习方向,首 ...

  6. npm WARN npm npm does not support Node.js v17.3.1解决方法

    每次执行npm命令都会出现下面的警告,很恼火 在网上找了一些解决方法,都没有得到解决. 原因: 本质上就是npm和node不配套,需要升级npm 或者node. 查询npm和node匹配关系:以往的版 ...

  7. HTML-CSS-JS Prettify报错Node.js was not found 解决方法

    HTML-CSS-JS Prettify报错Node.js was not found sublime编辑器安装的插件prettify,可以格式化js css html非常好用,但是装完之后总是提示N ...

  8. Ajax+Node.js前后端交互最佳入门实践(05)

    5.ajax简介 5.1.什么是ajax Asynchronous JavaScript and XML ,异步的javascript和XML 5.2.使用ajax有什么用 数据交互,可以从服务器获取 ...

  9. node.js async循环数组的方法

    Collections 集合处理 async.forEachOf  |  eachOf(object, iterator, callback) 实现功能:遍历object对象执行iterator,报错 ...

最新文章

  1. dedecms php5.4 无法退出后台,解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法...
  2. 详解DNS的常用记录(上):DNS系列之二
  3. SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59
  4. invalid floating point operation什么意思_Point-MVSNet:基于多视角的点云重建网络
  5. ns2相关学习——tcl脚本编写(1)
  6. mongodb运算符使用
  7. PyTips 0x03 - Python 列表推导
  8. python plot linestyle 线型颜色及线条控制(linestyle、marker、color)
  9. 注意,GitHub发布重大更新,关系到所有程序员!
  10. oc基础-protocol协议的使用
  11. java舆情分析_java毕业设计_springboot框架的舆情监测系统
  12. VC6.0和VC2012的全局对象的释放!!!
  13. 如何用matlab解决数学建模中的报童问题
  14. iOS 音频播放,录音,视频播放,拍照,视频录制
  15. PWA之 Service worker
  16. 一个登录页面的测试用例(借鉴他人的,方便查阅)
  17. Linux下查看隐藏文件夹
  18. 我们是如何将一个项目做烂的
  19. 科目三必看要点 驾驶经验汇总
  20. 《乌合之众》中的50金句

热门文章

  1. 计算机网络优化是啥,浅析计算机网络优化的方案.doc
  2. yjv是电缆还是电线_BVV属于电线还是电缆?
  3. java类描述_java笔记2:Java语言中的类和对象的描述
  4. Linux发行版新秀!风格对比苹果
  5. 肝!分享这3个京东实战项目!(知识图谱拿走不谢)
  6. 5 种 非传统 的可视化图,也是用Python画的
  7. wince 德赛西威2413_【图】GPS导航/Wince6.0系统 德赛西威迈腾车载导航改装评测_汽配中国网...
  8. 计算机教师应该读的书籍,信息技术教师读书心得
  9. 机器学习实战-逻辑回归-19
  10. redis特点单进程单线程高性能服务器,Redis为什么是单线程?Redis又为什么这么快!...