c语言调用dll别名,Node.js调用dll动态链接库

很神奇我自己写的第一个Nodejs的小程序就直接上手动态链接库的调用了,也是不容易。

起因是需要调用CUDA套件里的nvml.dll中的API来读取显卡信息,其中函数的参数会涉及基本类型、指针、结构体指针、指针的指针。对于一个Node初学者来说,花了两天的业余时间搞明白也是不容易。

模块介绍

首先是在Node中调用dll,这里的dll似乎只能是满足C规范的(C++的dll因为涉及名字空间、重载等问题,还没搞懂会怎样变化)(好在nvml.h的头文件中可以看出来结构和函数都是包在extern "C"{}里面的)。调用C语言程序需要用到FFI(Foreign function interface),它为动态链接库提供了一个很简洁的接口,而FFI是基于node-gyp的,这样使用有一个很不舒服之处是发生错误时只会报node-gyp编译错误,没有其他有效信息,但是对于小的调用,应该也足够了。

其次,为了正确处理指针类型,需要引入ref模块,它是对Buffer一个良好封装。ffi自身提供了一些预设的类型,如int,pointer,char,string等,基本的C语言类型都已经包括了,其中pointer对应的是void*,而string是char*的别名。ref本身提供了一个非常漂亮的文档,里面介绍了内置的类型。并且可以通过Buffer来扩充(当然对于结构体和数组的扩充已经有很好的实现了就不需要在小场景里重新造了)。ref提供了ref.ref(var)将var转换为引用(指针),ref.deref(var)将var解引用。与之相应,对类型提供了ref.refType(type)和ref.derefType(type),当然对于内置类型可以用字符串描述的,直接加星号*就足够了。对于已有的Buffer,提供了大量的read*函数用来辅助读取。

ref-struct和ref-array为ref提供了结构体和数组的类型扩展,它们可以方便地生成ref的类型格式,直接用在ffi调用中或者用ref来取得引用。

配置

安装node-gyp,出于个人喜好,我觉得将它安装到全局比较好,以后别的地方很有可能用到

npm install node-gyp --global

安装ffi及引用类型库

npm install ffi ref ref-struct ref-array --save

在nodejs中使用(下文会继续使用这几个变量名)

const ffi = require('ffi'),

ref = require('ref'),

struct = require('ref-struct'),

arrayType = require('ref-array');

包装调用

使用ffi的Library函数可以将dll中的函数load到js里,语法是

ffi.Library(libname, {

foo: [returnType, argTypes]

});

其中'libname'是库调用时的对象名,foo是函数名,returnType是返回值类型,既可以是ref支持的类型字符串如int等,也可以是类型对象。实际上内部会先用ref.coerceType(type)方法将字符串也转换成类型对象。类型对象是指如ref.types中定义的一系列对象(参见ref文档),或者ref-struct/ref-array生成的类型。argT

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值