electron通过node-ffi调用dll文件

在nodejs里有两种方式去调用dll文件:

第一种:如果有c++的开发经验就可以直接看 Electron使用NodeJS扩展模块调用DLL貌似也是官方推荐的方法,nodejs官网也提供了相关文档 文档链接

第二种:通过node-ffi模块,以下内容都是讲通过这个模块去调用的,适合前端开发的同学

image.png

1.切换成淘宝源,安装相关的环境依赖

  • python(v2.7 ,3.x不支持);

  • visual C++ Build Tools,或者 (vs2015以上(包含15))

  • .net framework 4.5.1
    或者执行
    (推荐)

    npm install --global --production windows-build-tools (你们看哪个方便,我是选了这个,会自动把python和c++开发工具包都集成进去)

2.安装node-gyp
npm install -g node-gyp
接着安装
npm install ffi --save
“好戏”开始了:

  • cannot find moudule(环境变量的路径有问题)


    electron通过node-ffi调用dll文件_第1张图片
    image.png

node-gyp的其它使用者提出一种解决方案: node 版本 10.15以上结合着这个模块会有路径问题,解决方法需要回退node版本至8,或者对变量设置路径

Windows: >set npm_config_node_gyp=C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js//我这里不能在powershell使用,命令不生效,cmd可以,这里设置你的实际路径)

  • TLS验证错误

    electron通过node-ffi调用dll文件_第2张图片
    image.png

    https://github.com/nodejs/node-gyp/issues/695 (解决方案,取消TLS证书验证)

    set NODE_TLS_REJECT_UNAUTHORIZED=0 依旧是个set 命令

  • error:MSB4019:未找到导入的项目...(嗯,貌似又是路径的问题)


    electron通过node-ffi调用dll文件_第3张图片
    image.png

到这里我就放弃执行 npm install ffi --save 这个命令了,我直接从git仓库里面去拉这个模块。(要是没有该问题的话可以跳过此步骤)

git clone git://github.com/node-ffi/node-ffi.git
cd node-ffi
node-gyp rebuild //如果是在electron里面使用的话还需要加上参数
electron通过node-ffi调用dll文件_第4张图片
image.png

终于生成代码了,没有报错只是给了些警告,我这里没有管它,直接把该文件夹copy到nodemodules中。
接着尝试一下nodejs里能不能调用到dll文件里的方法。

在当前目录里新建一个app.js文件,代码如下:

const ffi = require("node-ffi");
const User32 =  ffi.Library('user32', {
                'GetWindowLongPtrW': ['int', ['int', 'int']],
                'SetWindowLongPtrW': ['int', ['int', 'int', 'long']],
                'GetSystemMenu': ['int', ['int', 'bool']],
                'DestroyWindow': ['bool', ['int']]
            })
console.log(User32.DestroyWindow(1000));//返回false 

执行node app.js 应该能在控制台里看到返回值哦
PS :如果还不行可能是缺少ref ref-struct 还有bingdings模块。按照提示下载即可,ref同ffi都需要在当前目录执行 node-gyp rebuild 然后再copy文件夹到nodemodules目录里。

  • 如果直接在electron里面使用app.js的代码会报如下的错:

    electron通过node-ffi调用dll文件_第5张图片
    image.png

    通过rebuild编译出来的包node版本和electron里的Node版本不一致,在编译这些包时应该指定electron版本。
    执行 node-gyp rebuild -target=4.2.3 -arch=x64 --dist-url=https://atom.io/download/electron后再把对应的包放到nodemoudles里面去就好了。但是你们在指定electron的版本时不要直接看package.json里的,我这里显示的是^4.0.1,下载的模块版本时>=4.0.1的所以不是实际的版本号。

  • 在package.json里补充好之前通过rebuild后的依赖包信息,否则会报错,据其他网友说是打包的时候会重新下载这些依赖


    electron通过node-ffi调用dll文件_第6张图片
    image.png

相关资料

https://blog.csdn.net/liyangyang08/article/details/78835847

https://blog.csdn.net/wang839305939/article/details/83780789

你可能感兴趣的:(electron通过node-ffi调用dll文件)