yewanji 2023-06-01 14:54 采纳率: 36.3%
浏览 10
已结题

nodejs 通过ffi-napi 调用c++ dll函数,传入结构体后卡死

以下是nodejs代码

 const ffi = require('ffi-napi');
  const ref = require('ref-napi');
  var StructType = require('ref-struct-napi')
  // 定义结构体
  const MyStruct = StructType({
    id: ref.types.int,
    name: ref.types.CString
  });
  // 加载 C++ 模块
  const dllLib = ffi.Library('dll/test-plugin.dll', {
    'parseStruct': ['void', ['pointer']]
  });
  // 创建结构体实例
  const myStruct = new MyStruct();
  myStruct.id = 123;
  myStruct.name = '张三';

  // 调用 C++ 函数,传递结构体实例
  dllLib.parseStruct(myStruct.ref());

以下是dll函数的定义

typedef struct MyStruct {
    int id;
    string name;
};
extern "C" {
EXPORT void parseStruct(const MyStruct* stru)
}

以下是崩溃截图

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-01 17:18
    关注
    • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:使用node-ffi调用dll(主要解决unsigned char*作为返回值时遇到的问题)
    • 除此之外, 这篇博客: nodejs ffi调用C++dll动态库 ffi调用语法中的 一、环境安装、配置 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 1、以管理员权限打开cmd,输入快捷命令:npm install --global --production windows-build-tools

      这期间可能会遇到visual studio(C++工具包)安装不成功的情况:

      这种情况下可以使用离线安装的方式(通过以下链接下载离线安装包):

      https://pan.baidu.com/s/1Nh7cCrqyroEMH90HUYbvfw   提取码:5251

      直接安装:

      安装完成之后查看python是否安装成功:

       这说明安装成功,安装成功之后将python的路径添加到环境变量中:

      2、安装.net环境地址(可以选择4.6.2包)

      .NET SDKs downloads for Visual Studio

       3、安装上述各环境之后就可以安装ffi了,我这边安装的ffi版本是2.3.0的,使用命令

      cnpm install ffi@2.3.0,相对应类型转换的插件版本如下:

      "ffi": "^2.3.0",

      "ref": "^1.3.5",

      "ref-array": "^1.2.0",

      "ref-struct": "^1.1.0",

      4、安装上述环境的过程中遇到了很多问题,捣鼓了很久才把整个环境安装好,环境安装好之后调用动态库的过程也遇到很多问题,下面记录下自己在安装和调用的过程中遇到的一些问题:

      (1)报语法错误:

      上面的截图说是啥语法错误,在网上找了很多资料,很多说是因为nodejs版本高了的问题,于是我将nodejs版本降低,降低到了v11.10.0,然后再安装,最后成功了:

      (2)font.scss报错:

      上面截图的错误可以通过提示重新安装一遍sass,命令如下:

      npm rebuild node-sass

      (3)Error:Cannot find module 'ffi'

      上面的提示需要重新安装一遍ffi

      (4)Error: A dynamic link library (DLL) initialization routine failed

      上面报错问题需要执行下面的命令重新rebuild:

      1、npm config set python "C:\Python27\python.exe"

      2、npm config set node_gyp "C:\Users\10376\AppData\Roaming\npm\node_modules\node-gyp\bin\node-gyp.js"

      3、重新编译electron:./node_modules/.bin/electron-rebuild

      4、.\node_modules\.bin\electron-rebuild.cmd

      (5)调用动态库时报各种编码错误:

    • 以下回答由chatgpt基于相关博客总结生成:

      很抱歉,由于这是一个具体的技术问题,需要资深的IT专家对该问题进行分析和解决,而笔者并不具备相关专业知识,无法给出准确的解决方案。建议您寻求技术社区或在线论坛上的专业人士的帮助,或者联系原始动态库的开发人员。如果您能提供更多详细的信息,比如错误日志,相关代码等,这有助于其他人更好地理解问题并给出更准确的解决方案。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月1日
  • 修改了问题 6月1日
  • 创建了问题 6月1日

悬赏问题

  • ¥15 可以实现这个有不同背景颜色的九九乘法表吗?
  • ¥50 python写segy数据时出错2
  • ¥20 关于R studio 做精确稳定检验的问题!(语言-r语言)
  • ¥50 用贝叶斯决策方法,设计CAD程序
  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除? HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers 没用
  • ¥15 服务器安装php5.6版本