V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
uniy
V2EX  ›  JavaScript

web、nodejs 或者 electron 如何调用 c++的 dll 动态库?

  •  
  •   uniy · 2021-10-19 11:12:00 +08:00 · 2313 次点击
    这是一个创建于 891 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/node-ffi/node-ffi 已经 3 年没有更新了,看来这种方案并不是那么完美,有现在正在使用的吗. 尝试了多次,报错问题频繁,有没有别的方式去调用 dll?

    8 条回复    2021-10-19 17:27:55 +08:00
    Mikewu
        1
    Mikewu  
       2021-10-19 11:19:08 +08:00
    AoEiuV020
        2
    AoEiuV020  
       2021-10-19 11:19:31 +08:00
    node-gyp
    wszgrcy
        3
    wszgrcy  
       2021-10-19 11:41:31 +08:00
    我记得有个人 fork 了一份,然后继续维护了.
    g00001
        4
    g00001  
       2021-10-19 12:19:16 +08:00
    aardio 里网页调用原生 DLL 相对简单一些。

    嵌入 Electron 组件调用 DLL :
    ---------------------------

    import electron.app;
    var theApp = electron.app();

    theApp.html = /**
    <script>
    aardio = require("aardio");
    aardio.msgBox("内容","标题");
    </script>
    **/

    theApp.external = {
    msgBox = function(text,caption){
    ::User32.MessageBox(theApp.hwndChrome,text,caption,0)
    }
    }

    theApp.start("/res/index.html");
    win.loopMessage();


    WebView2 调用 DLL :
    ---------------------------

    import win.ui;
    var winform = win.form(text="WebView2")

    import web.view;
    var wb = web.view(winform);
    wb.external = {
    msgBox = function(text,caption){
    ::User32.MessageBox(winform.hwnd,text,caption,0)
    }
    }

    wb.html = /**
    <script> aardio.msgBox("内容","标题");</script>
    **/

    winform.show();
    win.loopMessage();


    JavaScript 直接调用 DLL :
    ---------------------------

    import win.ui;
    var winform = win.form(text="JS 直接调用 WinAPI")

    import web.blink.form;
    var mb = web.blink.form(winform);
    web.blink.export(
    user32 = ::User32;//导出 DLL 对象为 JS 全局变量
    form = winform; //窗口对象也可以导出为 JS 变量
    blink = mb; //mb 自己也可以导出为 JS 变量
    );

    mb.html = /**
    <a href='javascript:
    user32.MessageBox(0,"JS 直接调用 WinAPI","user32.MessageBox",0)
    '>JS 直接调用 WinAPI 函数试一下</a>
    **/

    winform.show()
    win.loopMessage();
    ysc3839
        5
    ysc3839  
       2021-10-19 13:02:32 +08:00 via Android
    建议把错误信息说清楚。
    不用 ffi 的话基本上要自己写模块封装了,可能会更麻烦。
    dcsuibian
        6
    dcsuibian  
       2021-10-19 13:20:55 +08:00
    不清楚具体场景。有没有可能弄一个 C++进程,一个 js 进程,通过网络通讯呢?
    参考微服务,感觉很麻烦,但是通用性很强。
    uniy
        7
    uniy  
    OP
       2021-10-19 14:14:36 +08:00
    @dcsuibian 这种是行的通的,做过尝试,就是本地起一个 websocket 服务,但还是觉得略繁琐
    Takashi123
        8
    Takashi123  
       2021-10-19 17:27:55 +08:00
    node-gyp+1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3033 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:40 · PVG 22:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.