Nodejs 调用 dll

1. 环境

  • Visual Studio 15
  • Nodejs 18.16.1

2. 动态链接库dll生成

2.1 新建项目

2.2 项目结构和代码

2.2.1 项目结构

2.2.2 代码示例

  • pch.h文件
arduino 复制代码
#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

//定义宏
#ifdef  IMPORT_DLL
#else
#define IMPORT_DLL extern "C" _declspec(dllimport)
#endif //  IMPORT_DLL

IMPORT_DLL int add(int a, int b);
  • dllmain.cpp 文件
arduino 复制代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

int add(int a, int b) {
	return a + b;
}

2.3生成dll文件

右键点击"生成",生成dll文件

3. 使用ffi-napi 或 koffi调用dll

本例使用为ffi-napi,但是在electron 等项目中,可能会出现build之后无法使用dll的情况,可以换成koffi

sql 复制代码
安装ffi-napi
yarn add ffi-napi

如果需要复杂数据类型,可以使用ref-napi 、ref-array-napi等
yarn add  ref-napi 
  • app.js
ini 复制代码
const ffi = require('ffi-napi');
const ref = require('ref-napi');
const ArrayType = require('ref-array-napi');

// 定义数组类型
const IntArray = ArrayType(ref.types.int);
const doubleArray = ArrayType(ref.types.double);

// 创建数组实例
const array = new IntArray([15, 25]);


let libm = ffi.Library("D:\\code\\cjj-workspace\\Dll4\\x64\\Release\\Dll4.dll", {
    'add': ['int', ['int', 'int']],
})

let tmp = libm.add(4, 9)
console.log(tmp)

执行结果:

4. 一些踩坑

  1. 调用dll报错 Dynamic Symbol Retrieval Error: Win32 error 127或者 Dynamic Linking Error: Win32 error 126

通常是因为找不到dll抛出的方法。 在Node.js中调用使用C++编译的DLL文件时,通常需要使用extern "C"来确保正确的函数签名和名称。 因为编译器在将源代码编译为二进制代码时会对函数名称进行"名称修饰"(Name Mangling),也称为名称混淆。这是为了在编译期间解决函数重载和类型安全的问题。名称修饰会改变函数名称的格式。

  1. dll发到缺少visual studio的环境,报错Dynamic Linking Error: Win32 error 126
  1. 检查dll路径是否错误
  2. 检查dll是否发的是release版本 通常vs生成的dll,默认是debug模式,这个模式生成的dll放到其他人的电脑不能直接使用的。想要生成移植到其他电脑也能使用的dll,需要点击 项目->属性 进行配置
相关推荐
荣达2 小时前
koa洋葱模型理解
前端·后端·node.js
csdn_aspnet3 小时前
Windows Node.js 安装及环境配置详细教程
windows·node.js
风若飞11 小时前
npm ERR! code CERT_HAS_EXPIRED
前端·npm·node.js
csdn_aspnet11 小时前
Windows、Linux 系统 nodejs 和 npm 版本更新及错误修复
linux·windows·npm·node.js
北城笑笑11 小时前
NodeJS 8 ,从 0 到 1:npm 包发布与更新全流程指南( 含多场景适配与踩坑总结 )
前端·npm·node.js·github
码码哈哈0.011 小时前
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚
前端·npm·node.js
歪歪10013 小时前
webpack 配置文件中 mode 有哪些模式?
开发语言·前端·javascript·webpack·前端框架·node.js
歪歪10013 小时前
如何配置Webpack以实现按需加载模块?
开发语言·前端·webpack·node.js
No喜欢吃香菜.1 天前
node.js卸载并重新安装(超详细图文步骤)
node.js
qq_12498707531 天前
基于node.js+vue的医院陪诊系统的设计与实现(源码+论文+部署+安装)
前端·vue.js·node.js·毕业设计