关于nodejs调用c/c++代码的一些感悟

news2024/12/27 16:21:10

帮客户解决问题,他们做的业务涉及到硬件,但是桌面端程序员离职,临时接手的人员,只会node,于是希望通过node调用c

基本套路,使用ffi和ref插件,打开设备正常,但就是无法读取数据。

接手问题,第一步是环境

macosx下面,安装node和ffi 非常丝滑。但是不知为什么CH375芯片的USB驱动,在我的电脑上无法使用,所以怎么都发现不了设备。打不开设备,也就没办法推进问题。

转win10系统,双系统的macair电脑,硬盘有点少,win10总共40G,安装个vc环境,我的硬盘就快爆了。所以,每次发现安装版本不对的时候,只能卸载重新安装。每次听着自己八年老本子风扇狂转,心疼的说不出话。

关于python,环境要求必须是3.7以上。我折腾了三次。。。。。

关于nodejs,因为客户使用node 10.1,所以也是装了卸,吐了吃。。。。。。

关于vs,不知道为什么,ffi编译的时候,需要vs2013以上(不含2013),我的老花眼,居然看成只支持2013,一番折腾。。。。。

最后安装了vs2022,但是安装ffi的时候一直提示找不到msbuild,我。。。。。心疼本,所以开始修改node-gyb相关插件的js代码

修改如下

find-visualstudio.js文件

  

 

 

 

关于代码 ,有问题版如下


const ffi = require('ffi');
const ref = require('ref');
//const refArray = require('ref-array');
const fs = require('fs');

//const pvoid = ref.types.Buffer;

const libm = ffi.Library('CH375DLL64', {
    // 函数名 返回类型 传入参数类型2个参数
    'CH375OpenDevice':['long',['long']],
    'CH375GetDeviceName':['string',['ulong']],
    'CH375ReadData': ['bool', ['ulong', "void *","ulong *"]],
    
    // 'CH375SetDeviceNotify':['bool',['ulong',]],
    'CH375SetBufUpload':['bool',['ulong','ulong']],
    'CH375QueryBufUpload':['long',['ulong']],
    'CH375CloseDevice':['void',['ulong']],
    'CH375GetVersion': ['ulong', []],
    'CH375SetDeviceNotify': ['ulong', ['ulong']],

});

(async () => {
    const openRes = libm.CH375OpenDevice(0);
    console.log(libm.CH375GetDeviceName(0))

    let buf = Buffer.alloc(64);
    buf.types = ref.types.char
    let size = Buffer.alloc(1);
    size.type = ref.types.ulong;
    console.log("asf")
    const ret = libm.CH375ReadData(0, buf, size.ref());
    console.log(ret);
    console.log(buf);

    console.log(size);
    libm.CH375CloseDevice(0);

})();

受网上谋篇不知名的博客影响,写出如上代码,buf里面,怎么都获取不到数据,但是ret的返回值,却又是true,证明我们已经成功的调用到了dll文件的方法。

最终版代码


const ffi = require('ffi');
const ref = require('ref');
//const refArray = require('ref-array');
const fs = require('fs');

//const pvoid = ref.types.Buffer;

const libm = ffi.Library('CH375DLL64', {
    // 函数名 返回类型 传入参数类型2个参数
    'CH375OpenDevice':['long',['long']],
    'CH375GetDeviceName':['string',['ulong']],
    'CH375ReadData': ['bool', ['ulong', "pointer","pointer"]],
    
    // 'CH375SetDeviceNotify':['bool',['ulong',]],
    'CH375SetBufUpload':['bool',['ulong','ulong']],
    'CH375QueryBufUpload':['long',['ulong']],
    'CH375CloseDevice':['void',['ulong']],
    'CH375GetVersion': ['ulong', []],
    'CH375SetDeviceNotify': ['ulong', ['ulong']],

});

(async () => {
    const openRes = libm.CH375OpenDevice(0);
    console.log(libm.CH375GetDeviceName(0))

    let buf = Buffer.alloc(64);
    buf.types = ref.types.char
    let size = Buffer.alloc(1);
    size.type = ref.types.ulong;
    console.log("asf")
    const ret = libm.CH375ReadData(0, buf, size.ref());
    console.log(ret);
    console.log(buf);

    console.log(size);
    libm.CH375CloseDevice(0);

})();

是不是没看出来什么差别?仔细看CH375ReadData引入的部分,是不是?

也不知道是哪个王八蛋给的实例,明明指针有对应的pointer类型,非要用什么void* 之类的。

你问问怎么找到这个结果的,我说我看完了ffi的代码你信吗?截图就是ffi的代码内容,明确指明类型要用pointer。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python游戏】用Python实现一个测试你智商的小游戏——24点,过不了三关的都是细狗 | 附带源码

前言 好咯,包子们下午好 今天小编主要是过来测试一下大家的智商,没别的意思,不是看不起大家,我感觉今天实现的小游戏,可能大家真的过不了三关! 哈哈哈,废话不多说吧 直接开始我们的游戏实现功能…

五、【React-Router6】路由表 useRoutes() + Outlet

文章目录1、useRoutes() 介绍2、简单 CODING2.1、项目结构2.2、routes.js2.3、App.js2.4、Result3、嵌套 Outlet CODING3.1、项目结构3.2、routes.js3.3、Home.js3.4、App.js3.5、Result1、useRoutes() 介绍 原来写的路由管理如下 <Routes><Route path/about elemen…

codeforces:C. Almost All Multiples【构造 + 贪心】

目录题目截图题目分析ac code总结题目截图 题目分析 现在p1 x, pn 1如果我们一开始按1234…这样放字典序是最小的所以根据这个思路&#xff0c;我们还是按这个构造&#xff1a;那么我们的n被挤出来了&#xff0c;只能放到px上所以如果一开始x不能整除n的话&#xff0c;就直接…

Linux安装MySQL【Ubuntu20.04】

操作系统&#xff1a;Ubuntu20.04 使用工具&#xff1a;xshell7、xftp7 MySQL版本&#xff1a;5.7 一、删除Linux系统下自带的mariadb &#xff08;因为centos自带一个老版Mariadb 与MySQL冲突&#xff09; 如果没有找到Mariadb直接跳过 #查找Mariadb rpm -qa | grep maria…

面试总结2

用时&#xff1a;40min 自我介绍hashset存储对象怎么进行判断是否重复 Synchronized底层实现原理 Synchronized锁的升级过程 讲讲开发中常用到的spring注解spring事务&#xff0c;传播机制&#xff0c;隔离级别说一说你常用的git命令说一说你对IOC、AOP的理解1、hashset存储对…

[Linux打怪升级之路]-秒懂进程地址空间

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、C/C下…

【GIT】常用操作总结

一、在本地仓库及远程仓库创建分支&#xff0c;并建立关联关系。 1、创建本地分支&#xff0c;如图&#xff1a; 2、填写分支名称&#xff0c;勾选Checkout branch&#xff1a; 3、提交本地分支到远程分支&#xff1a; 右键选择Git -- Repository -- push&#xff1a; push的时…

Python爬取的网页,需要解码怎么办

前言 本文是该专栏的第26篇,后面会持续分享python的爬虫干货知识,记得关注。 很多时候,在用爬虫采集数据的时候,采集到的源码内容并非我们想要的正确信息,使用正则或者Xpath匹配到的信息也需要我们再次解码才能拿到精准的数据。最近也正是球迷朋友们非常关注卡塔尔世界杯…

[操作系统笔记]基本分段存储管理

内容系听课复习所做笔记&#xff0c;图例多来自课程截图 分段原理 与“分页”最大的区别就是&#xff1a;离散分配时所分配地址空间的基本单位不同 分页是不管程序的逻辑的&#xff0c;规定了页大小就是这么多&#xff0c;但是分段是依据程序自身逻辑来划分的&#xff08;分页的…

micro-app-源码解析4-数据通信篇-终篇

沙箱篇官方讲解地址 https://github.com/micro-zoe/micro-app/issues/21 1. 带着问题进行阅读 在做框架的时候&#xff0c;没法避免的遇见父子通信和兄弟通信的问题&#xff0c;但是如何实现通信这是个每个框架需要解决的问题。1.1 如何选择父子通信的方式 最好的方式应该是…

IOC操作Bean管理(基于注解方式)

IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 目录 什么是注解 Bean 管理注解方式&#xff08;创建对象&#xff09; 基于注解方式实现对象创建 第一步&#xff1a;引入依赖 第二步&#xff1a;开启组件扫描 创建类&#xff0c;在类上面添加创建对象注解…

Python爬虫实战,request+Matplotlib模块,Python绘制一个足球运动员的数据可视化图表

前言 用Python和Matplotlib绘制一个足球运动员的数据可视化图表。 Let’s start happily 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; bs4模块 requests模块 pandas模块 matplotlib模块 json模块 numpy模块 环境搭建 安装Python并添加到环境变量…

Sqoop数据导入 第2关:Mysql导入数据至HDFS上

为了完成本关任务,你需要掌握: 1、数据库( MySQL )建表。 2、Mysql 数据导入至 HDFS 中。 数据库( MySQL )建表 用命令进入 MySQL 客户端。 mysql -uroot -p123123 -h127.0.0.1 创建数据库hdfsdb(格式默认为utf8),并在数据库内建立表student,其表结构如下: mys…

通过求解数学模型来选择编码节点的最佳数量和位置(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

【✨十五天搞定电工基础】电阻电路的分析方法

本章要求1. 掌握支路电流法、叠加原理和戴维宁定理等电路的基本分析方法; 2. 了解实际电源的两种模型及其等效变换; 3. 了解非线性电阻元件的伏安特性及静态电阻、动态电阻的概念&#xff0c;以及简单非线性电阻电路 的图解分析法。 目录 一、电阻串并联连接的等效变换 1、…

企业如何有效的防爬虫?

防爬虫&#xff0c;简单来说&#xff0c;就是在尽量减少对正常用户的干扰的情况下尽可能的加大爬虫的成本。 而反防爬虫&#xff0c;或者说制造隐蔽性强的爬虫&#xff0c;就是尽量模拟正常用户的行为。 这两者是动态博弈的。大公司基本都有防爬的项目&#xff0c;以保护数据…

一图了解es6常用数据迭代函数map,filter,fill,reduce

一、一图胜千言 前端开发中&#xff0c;js数组处理是最常用的&#xff0c;除了for循环外&#xff0c;随着es6的普及&#xff0c;像reduce()、filter()、map()、some()、every()以及…展开属性都是最常用到的。 今天偶然从网上看到这张图&#xff0c;真是眼前一亮&#xff0c;真…

盘点JAVA中延时任务的几种实现方式

场景描述 ①需要实现一个定时发布系统通告的功能&#xff0c;如何实现&#xff1f; ②支付超时&#xff0c;订单自动取消&#xff0c;如何实现&#xff1f; 实现方式 一、挂起线程 推荐指数&#xff1a;★★☆ 优点&#xff1a; JDK原生(JUC包下)支持&#xff0c;无需引入新…

RabbitMQ之集群管理

1、在node2、node3、node4三台Linux虚拟机中安装RabbitMQ。 2、从node2拷贝.erlang.cookie到node3、node4的相应目录 如果没有该文件&#xff0c;手动创建/var/lib/rabbitmq/.erlang.cookie &#xff0c;生成Cookie字符串&#xff0c;或者启动一次RabbitMQ自动生成该文件。生产…

五年Java编程生涯,大专学历最终逆袭阿里,面试+学习+经历分享

五年时间&#xff0c;对于程序员来说&#xff0c;真的非常非常宝贵&#xff0c;掉的头发都够塞满键盘的缝隙了。就说新一代偶像 TFboys 吧&#xff0c;你应该知道这个组合吧&#xff0c;黄金合作期也就三五年的时间&#xff0c;现在基本上就处于各自单飞&#xff08;solo&#…