Nodejs调用C++文件

作为一个从未使用过nodejs的新手,最近老师要求将学长做过的nodejs的界面与C++接口连接,于是俺走上了一条艰辛的路。
在查阅资料的时候,我感到无比的艰难,网上只有如何连接dll的(这类文章也比较少),但是却没有报错如何解决,下面我将列举全部我还记得的错误,这次接口的连接耗时大致在4天左右(每天都觉得是最后一天)。
首先是由于nodejs没有C++的数据类型(在这里我用的是fii方法加载的动态链接库,dll文件),必须要使用ref模块,更神奇的是这个模块完全安装不上,再网上有很多参考直接使用ref的,最好别看,因为这个ref环境,根本配不出来,呵呵呵呵,那咋整呢,这是唯一的出路,于是,在ref安装报错的时候,

cannot find module 'ref'  

建议大家使用ref-napi,也就是执行

npm install ref-napi

然后在require命令里面把ref换成ref-napi,大功告成,接下来你就会发现,你还要使用ref-array,ref-struct,参考ref直接执行

npm install ref-array-napi
npm install ref-struct-napi

如果只是安装在项目里面直接进入项目路径就可以,别看只是三个命令,差不多用了一天,,,才找到这些,然后就是使用ffi.library加载动态链接库,然后你就会发现,我还没有ffi,参考上面,你再使用就ok

npm install fii-napi

接下来就是实现加载dll了
参考一下链接使用

https://fuhanghang.blog.csdn.net/article/details/116058577?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2-116058577-blog-107199690.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2-116058577-blog-107199690.pc_relevant_vip_default&utm_relevant_index=3

在加载dll文件的时候,你会碰到以下几个问题:
加载的时候报126号错误,127号就不说了,你函数名写错了,咋才能写对呢?你去找dll文件的依赖,网上方法很多,可以下载软件,也可以使用dumpbin -export命令。
先找到这个文件

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat

把他 拖拽到cmd窗口,然后使用

dumpbin -exports  USERSDK.dll

126命令的话就是依赖不对,这个时候可以改变环境变量的值

process.env.PATH=`./0723dll`;

不过我用软件找到依赖之后,他还是继续报126号错误,我无语了,我直接把整个电脑的dll文件都提取出来,然后压缩,放到你想要的文件夹里面解压缩,最后就不报错了,终于连接上了!

在这里最可怕的一种错误是not connected,

[21072:0723/221227.713:ERROR:crashpad_client_win.cc(814)] not connected

这个报错基本就是参数传递错误,应该是形参类型,形参对应的数据类型(比如结构体某个类型定义错了),我们这里使用的是一个上下文的void类型,这个类型很奇怪,他在调用函数和回调函数里面都是一个类型,但是你不能给他写成一样的,应该在回调函数里面写成void,然后在调用函数里面写成ref.types.Object,之后给他传this指针。

然后下一步是需要调用函数,这个函数很奇怪,它是有回调函数的,我们忽视了这个回调函数,导致每一次用的时候他都会卡死,然后再看接口手册,发现只需要等到接口函数调用那个状态结束的回调之后你这边就可以继续调用了。

之后还有一个特别重要的是:回调函数的结果,他是以一个buffer类型传递回来的,所以应该,我们那个是一个指针类型,使用的是ref,refType(结构体名),然后传回来的时候,应该给他解地址,也就是调用deref方法,于是就可以正常使用了,不然按照一个字符数组没法使用
比如:

 <Buffer@0x000000EA67BFE7E0 14 a5 b1 54 ae e4 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 1230 more bytes, type: { [Function: StructTy
pe] defineProperty: [Function: defineProperty], toString: [Function: toString], fields: { timestamp: [Object], recommend: [Object], recom_gaze: [Object], left_gaze: [Object], right_gaze: [Object], left_pupil: [Object], right_pupil: 
[Object], left_ex_data: [Object], right_ex_data: [Object], stats: [Object] }, size: 1280, alignment: 8, indirection: 1, isPacked: false, get: [Function: get], set: [Function: set], _instanceCreated: true }>

还有最后一步就是:Nodejs鼠标的控制,我们一开始查到的是robotjs,但是这个版本配不明白,于是放弃,后来发现你可以使用node-win-mouse这个模块

后记:在这里我必须要吹一下吉林大学吉甲大师社团,在这里你可以拥有多台显示器和主机(换着使),甚至两个显示器共同使用,还有本科生可用的上万的设备,以及步兵车和其他你想学习的知识,比如:计算机视觉,电控,机械以及其他,甚至可以获得国奖,只不过要辛苦工作一年。吉林大学在大型国际赛事上表现相当出色,欢迎各位报考吉大计算机!
注:以上所述在未来将有补充,如果有其他问题欢迎私信或评论。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值