yewanji 2023-05-18 10:50 采纳率: 36.3%
浏览 55
已结题

nodejs 通过ffi-napi 调用c++ dll函数乱码问题

问题是这样的,因为nodejs 不能直接操作硬件相关的东西,所以我通过c++写了一个dll,导出函数给nodejs调用,以下是我的c++相关代码

extern "C" {
    EXPORT  const char* sayBye();
    }
        const char* sayBye() {
    string name = "java 最好的语言";
    return name.c_str();
}
      
  const ffi = require('ffi-napi');
  const myLib = ffi.Library('dll/test-plugin.dll', {
    'sayBye':['string',[]]
  });
  var result=myLib.sayBye()
  console.log('result',result)

img

  • 写回答

3条回答 默认 最新

  • CF2301_77400554X 2023-05-18 11:35
    关注

    引用chatgpt部分指引作答:
    这个报错信息是关于 Electron 的安全警告,提示你的应用程序的 Content Security Policy(内容安全策略)可能存在问题。它指出你的应用程序的渲染进程(renderer process)的 Content Security Policy 要么没有设置,要么启用了 "unsafe-eval",从而给用户带来了不必要的安全风险。

    这个报错与你的代码中调用 C++ DLL 的乱码问题没有直接关系。不过,我注意到你的 C++ 代码中有一个潜在的问题可能导致乱码。

    在你的 C++ 代码中,你将一个字符串赋值给了 name 变量,然后通过 name.c_str() 返回了一个指向该字符串的指针。然而,在 C++ 中,局部变量的生命周期在其所在的作用域结束时就会结束,这意味着 name 变量在函数 sayBye 结束时会被销毁,返回的指针将变为无效指针。因此,在 Node.js 中使用这个指针可能会导致未定义的行为和乱码。

    要解决这个问题,你可以考虑使用动态内存分配,例如使用 new char[] 来存储字符串,并在使用完之后手动释放内存,确保指针有效。下面是一个修改后的示例:

    const char* sayBye() {
        string name = "java 最好的语言";
        char* namePtr = new char[name.size() + 1];
        strcpy(namePtr, name.c_str());
        return namePtr;
    }
    

    然后,在 Node.js 中,你需要注意释放内存,以防止内存泄漏。你可以使用 ffi 模块提供的 ffi.Callback() 方法来定义一个回调函数,在回调函数中释放内存。下面是一个修改后的示例:

    const ffi = require('ffi-napi');
    
    const myLib = ffi.Library('dll/test-plugin.dll', {
      'sayBye': ['string', []]
    });
    
    const releaseMemory = ffi.Callback('void', ['pointer'], (ptr) => {
      // 释放内存
      ffi.Library('msvcrt', {
        'free': ['void', ['pointer']]
      }).free(ptr);
    });
    
    myLib.sayBye.async = ['string', []];
    myLib.sayBye.post = releaseMemory;
    
    myLib.sayBye((err, result) => {
      if (err) {
        console.error(err);
      } else {
        console.log('result', result);
      }
    });
    

    这个示例中,我们使用 ffi.Callback() 定义了一个回调函数 releaseMemory,该函数接受一个指针作为参数,并在其中调用 msvcrt 库的 free 函数释放内存。然后,通过将 releaseMemory 函数传递给 myLib.sayBye.post,在调用 sayBye 之后自动释放内存。

    这只是一个潜在的问题,可能导致乱码的原因之一。如果你仍然遇到乱码问题,请提供更多关于问题的详细信息,以便更好地理解和帮助你解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月26日
  • 已采纳回答 5月18日
  • 赞助了问题酬金15元 5月18日
  • 创建了问题 5月18日

悬赏问题

  • ¥100 科大讯飞语音唤醒词,unbuntu环境,报错
  • ¥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 没用