栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Nodejs调用C++文件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 FilesMicrosoft Visual Studio2022CommunityVCAuxiliaryBuildvcvars32.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方法,于是就可以正常使用了,不然按照一个字符数组没法使用
比如:

  [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这个模块

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号