使用Electron开发基于Node.js的桌面应用:调用C++写的dll(二)

序言

本篇将讲解node.js如何通过调用c++提供的DLL接口来实现更底层的功能。nodejs开发环境的搭建可以参考我第一篇的介绍https://blog.csdn.net/dm569263708/article/details/97394690

一、介绍

js调用c++可以通过多种方式实现,本文介绍的是通过ffi来调用dll。

二、环境配置

安装ffi有2种方式:

  1. 在项目目录里面输入:npm install ffi
  2. 在package.json文件里面配置ffi属性,在项目目录里面输入:npm install。 这时会自动根据配置的属性安装项目需要的运行环境。
  3. 安装完成后需要重新编译ffi模块,命令:.\node_modules\.bin\electron-rebuild

三、代码调用

编写一个简单的c++导出库dll,注意导出接口需要按照C的格式。

extern "C" __declspec(dllexport) int fnTestDll()
{
    return 42;
}

js代码如下: 

const ffi = require('ffi');
const ref = require('ref');
const path = require('path');
const libpath = path.join(__dirname,  './sdk/test.dll');
const sdkLib = ffi.Library(libpath, {
      'fnTestDll': ['int', []],
 });
var bInit=sdkLib.fnTestDll();

四、注意可能会遇到的坑

1.传递参数

传递指针类型如 int* 需要用到 ref.refType('int'),char*可以直接使用string。

'test': ['int', [ref.refType('int')]],
'test2': ['bool', ['int','string','int','bool']],

结构体

typedef struct {
    byte UID[16];
    byte UType[6];
    int ProdNo;
    int ProdPrice;
} DishInfo;

转换的js格式如下

var refStruct = require('ref-struct');
var refArray = require('ref-array');

var DishInfo = refStruct({
    'UID': refArray('byte', 16),
    'UType': refArray('byte', 6),
    'ProdNo': ref.types.int,
    'ProdPrice': ref.types.int
});

2.编译错误

A JavaScript error occurred in the main process
Uncaught Exception:
Error: The module '/home/flyahed/electron/zezeta/node_modules/robotjs/build/Release/robotjs.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 48. This version of Node.js requires
NODE_MODULE_VERSION 64. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:740:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:166:20)
    at Module.load (internal/modules/cjs/loader.js:620:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:559:12)
    at Function.Module._load (internal/modules/cjs/loader.js:551:3)
    at Module.require (internal/modules/cjs/loader.js:658:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/home/flyahed/electron/zezeta/node_modules/robotjs/index.js:1:170)
    at Object.<anonymous> (/home/flyahed/electron/zezeta/node_modules/robotjs/index.js:38:3)

需要注意的是,node和electron的版本选择十分重要,如果它们的NODE_MODULE_VERSION版本不一致会报这个错。node的内核版本可以通过这个地址查看https://nodejs.org/zh-cn/download/releases/。

解决办法:下载NODE_MODULE_VERSION版本一致的node和electron进行安装。参考我的版本配置

关于node.js开发环境的搭建可以参考我的上一篇博客:https://blog.csdn.net/dm569263708/article/details/97394690

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那一片海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值