使用node-ffi调用dll动态库

一、为什么要在node.js中调用动态链接库

由于之前公司的一个项目中,需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的

当时有两个方案:

  1. 由后端人员编写一份服务去掉调用dll,前端页面直接通过发请求到这个服务上进行操作
  2. 在前端部分使用node-ffi直接调用dll动态库文件

最终我们使用了第二个方案!

二、什么是node-ffi

Node FFI Tutorial

node-ffi provides a powerful set of tools for interfacing with dynamic libraries using pure JavaScript in the Node.js environment. It can be used to build interface bindings for libraries without using any C++ code.

注意事项!

  • ffi只能调用C风格的模块。
  • 需要将C源码build成动态链接库以供调用,在Linux下将C源码build成.so文件,在windows下build成.dll文件

三、安装node-ffi

npm install ffi
复制代码

四、如何使用node-ffi

简单例子:

  1. 我们的业务中由这么一个API, 参数是一个short类型的端口号,一个int类型的波特率,返回小于0则表示失败,否则是机器的标识码,方法名是 dc_init
int USER_API dc_init(short port, int baud);
复制代码
  1. 下面是如何利用ffi在nodejs中调用这个接口,该接口的源码已经被封装成 dcrf32.dll 这个动态链接库了,我们直接调用就好。
let ref = require('ref')
let FFI = require('ffi')

let shortType = ref.types.short
// dll文件的路径
let dllPath = __dirname + '/dll/dcrf32.dll'

let lib = new FFI.Library(dllPath, {
  'dc_init': ['int', [shortType, 'int']]
})

let handle = lib.dc_init(2, 9600)
console.log(handle)
复制代码

关于ref的详细api可以参看他们的官方文档:https://github.com/TooTallNate/ref

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js可以使用`ffi`模块调用设备驱动的dll动态库。`ffi`模块 stands for `Foreign Function Interface`(外部函数接口),它允许Node.js应用程序直接调用动态链接库中的C/C++函数。 使用`ffi`模块调用设备驱动的dll动态库,首先需要安装`ffi`模块。可以使用npm(Node.js的包管理器)通过以下命令进行安装: ```shell npm install ffi ``` 安装完成后,可以在Node.js应用程序中使用`ffi`模块调用设备驱动的dll动态库。首先需要引入`ffi`模块: ```javascript const ffi = require('ffi'); ``` 然后,使用`ffi.Library`方法加载dll动态库,并定义要调用的函数: ```javascript const libraryPath = 'path/to/your/device/driver.dll'; const myLibrary = ffi.Library(libraryPath, { 'functionName1': ['returnType1', ['parameterType1', 'parameterType2']], 'functionName2': ['returnType2', ['parameterType3', 'parameterType4']] }); ``` 在上述代码中,`functionName1`和`functionName2`是设备驱动DLL中的函数名,`returnType1`和`returnType2`是函数的返回值类型,`parameterType1`、`parameterType2`、`parameterType3`和`parameterType4`是参数的类型。 接下来,可以通过调用`myLibrary`对象的方法来调用设备驱动DLL中的函数: ```javascript myLibrary.functionName1(parameter1, parameter2); ``` 其中,`parameter1`和`parameter2`是要传递给设备驱动DLL函数的参数。 通过以上步骤,就可以在Node.js应用程序中调用设备驱动的dll动态库了。当然,在调用之前,需要确保设备驱动dll动态库的路径正确,以及设备驱动dll动态库中的函数名、参数类型和返回值类型的定义正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值