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 IDE 和 Python):
npm install node-gyp -g

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

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


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


ok,现在我们分别创建源文件 module.cpp 和 binding.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))</

最低0.47元/天 解锁文章
1343

被折叠的 条评论
为什么被折叠?



