前段时间工作中遇到一个需求,node.js 需要调用 dll 提供的一些方法来实现业务需求。
一开始,调研了现有的一些 node.js 库,如:ffi-napi
、koffi
,最终发现调用方写的代码太痛苦了。
如使用 koffi,举个例子:
const koffi = require("koffi");
// Load the shared library
const lib = koffi.load("user32.dll");
// Declare constants
const MB_OK = 0x0;
const MB_YESNO = 0x4;
const MB_ICONQUESTION = 0x20;
const MB_ICONINFORMATION = 0x40;
const IDOK = 1;
const IDYES = 6;
const IDNO = 7;
// Find functions
const MessageBoxA = lib.func("__stdcall", "MessageBoxA", "int", [
"void *",
"str",
"str",
"uint",
]);
const MessageBoxW = lib.func("__stdcall", "MessageBoxW", "int", [
"void *",
"str16",
"str16",
"uint",
]);
let ret = MessageBoxA(
null,
"Do you want another message box?",
"Koffi",
MB_YESNO | MB_ICONQUESTION
);
if (ret == IDYES) {
MessageBoxW(null, "Hello World!", "Koffi", MB_ICONINFORMATION);
}
对于前端开发,压根不懂 __stdcall, void *, str16, unit
这些。
理想的(期望)调用方式如下:
const addon = require("addon");
let ret = addon.MessageBoxA(null,
"Do you want another message box?",
"Koffi",
MB_YESNO | MB_ICONQUESTION
);
为了实现理想的调用方式,那就不能用通用的解决方案(ffi-napi
、koffi
),需要基于C/C++ addons with Node-API,但这个方案也有缺点,就是你需要会 C/C++,如果你不会或者你团队没有会 C/C++ 的,那我建议你还是 koffi
这种通用的解决方案。
那就上一张图吧,具体的代码就不放上来,在这里只希望给遇到同样问题的人提供一个思路,具体的代码需要自己去探索。