基于 node.js 实现一个web打印解决方案

分类:打印     发布时间:2024-07-15     最后更新:2024-08-12     浏览数:608
前段时间工作中遇到一个需求,node.js 需要调用 dll 提供的一些方法来实现业务需求。 一开始,调研了现有的一些 node.js 库,如:ffi-napi、koffi,发现调用方写的代码太多重复

前段时间工作中遇到一个需求,node.js 需要调用 dll 提供的一些方法来实现业务需求。

一开始,调研了现有的一些 node.js 库,如:ffi-napikoffi,最终发现调用方写的代码太痛苦了。 如使用 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-napikoffi),需要基于C/C++ addons with Node-API,但这个方案也有缺点,就是你需要会 C/C++,如果你不会或者你团队没有会 C/C++ 的,那我建议你还是 koffi 这种通用的解决方案。

那就上一张图吧,具体的代码就不放上来,在这里只希望给遇到同样问题的人提供一个思路,具体的代码需要自己去探索。

上一篇: 记一次 Electron 调用 C++ addon 报错 下一篇: Web 打印服务之需求篇