我是如何在electron上调用dll的导出函数的 - node-addon-api

1. 需求

今天是2024年10月21日,昨天我发了个文章,叫《我是如何在electron上调用dll的导出函数的 - koffi库》。然后昨天晚上我将其应用到项目的时候,发现一个个地去构造 结构体、函数原型 真的太浪费时间了;而且我们的dll里边有具体业务代码,代码几乎都用了std标准库的许多功能(比如 std::string、std::vector ),这些在 ffi 上也很难构造。鉴于这些情况,我又不得不重新想个新方法。

现在我想到的方法是:用 c++ 编写出一个 node 模块,这个 node 模块链接了业务dll的导出函数,然后再将此模块导入进 electron 中。
想象一下,就是 electron 和 业务dll 有了联系,而在此中间搭建这种联系的桥梁就是这个 node 模块。(也就是 中介、枢纽、媒婆)

最后我实践了下,发现这个想法确实可以!因此我打算把其中的经过过程都写下来分享。(因为这是我所想到的一种思路,以后出现了什么坑或者问题啥的,就还会回来补充的)


额外说明:把业务代码直接迁移到 node 模块上其实也是可以的,但是在这篇文章中,我们的设想是为一个已有项目 的c++代码与 electron 进行连接。如果这个 已有项目 本身足够庞大,那么直接把代码迁移到 node 模块上就会显得不太现实,而且没有必要。(至少对于我们的项目来讲,就不会这样去做)

2. 参考

node官方文档:
[C++ addons] https://nodejs.org/docs/latest/api/addons.html
---- 对应中文文档:[C++ 插件] https://nodejs.cn/api/addons.html

[C/C++ addons with Node-API] https://nodejs.org/docs/latest/api/n-api.html
---- 对应中文文档:[C/C++插件(使用 Node-API)] https://nodejs.cn/api/n-api.html

node-addon-api github仓库: https://github.com/nodejs/node-addon-api 【看这个仓库的readme】
node-addon-examples github仓库: https://github.com/nodejs/node-addon-examples

3. 思路

我们先试着调用一个MessageBox

首先在 npm 上全局安装 node-gyp(需要安装 Visual Studio IDEPython):

npm install node-gyp -g

在这里插入图片描述

接着创建一个文件夹作为整体项目文件夹,我这里取名为"addon"

在这里插入图片描述

在此文件夹下用 管理员权限 打开一个cmd,输入npm init,根据它的提示输入相应的信息,最后yes确认,在文件夹下成功生成 package.json

在这里插入图片描述
在这里插入图片描述

接着输入 npm install node-addon-api,将 node-addon-api 安装到当前目录下

在这里插入图片描述
在这里插入图片描述

ok,现在我们分别创建源文件 module.cppbinding.gyp(注意:后者文件名必须只能叫binding.gyp!!!)

//module.cpp

#include <napi.h>
#include <Windows.h>
#include <string>

Napi::Number Method(const Napi::CallbackInfo& info) {
   
   
	std::wstring str = L"Hello,World";
	MessageBoxW(NULL, str.c_str(), L"From addon.node", MB_OK);
	Napi::Env env = info.Env();
	return Napi::Number::New(env, 0);
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
   
   
	exports.Set(Napi::String::New(env, "msg"), Napi::Function::New(env, Method))</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值