原文地址:
一、为什么需要使用DLL
- 需要使用系统 API 操作或扩展应用程序;
- 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过C++ 动态链接库(DLL)实现的;
- 需要调用C++实现的一些复杂算法等。
二、node-ffi 是什么
@H_502_19@node-ffi:Node.js Foreign Function Interface @H_502_19@node-ffi
is a Node.js addon for loading and calling dynamic libraries using pure JavaScript. It can be used to create bindings to native libraries without writing any C++ code. It also simplifies the augmentation of node.js with C code as it takes care of handling the translation of types across JavaScript and C,which can add reams of boilerplate code to your otherwise simple C. See the example/factorial for an example of this use case.
@H_502_19@WARNING:node-ffi
assumes you know what you're doing. You can pretty easily create situations where you will segfault the interpreter and unless you've got C debugger skills,you probably won't know what's going on.
@H_502_19@上面是 node-ffi 的介绍,英语不好,就不翻译了。
三、electron 使用 node-ffi
@H_502_19@使用上一篇文章里的项目,在 package.json的 dependencies节点上加上node-ffi 依赖:"dependencies": { "electron": "^1.6.11","ffi": "2.2.0" }
const ffi = require('ffi')
set python=python安装路径\python.exe
"./node_modules/.bin/electron-rebuild" "./node_modules/ffi"
四、使用 ffi 调用 Widows API 解决一个小缺陷
@H_502_19@上篇文章中的仿 QQ 登录界面还有一个小问题,就是鼠标右键点击窗口的任意地方,都会弹出系统菜单: @H_502_19@现在使用 ffi 调用 user32.dll 中的GetSystemMenu 函数来解决这个问题,首先新建一个 user32.js 文件,为了展示 ffi ,我多定义了几个API函数:const ffi = require('ffi') exports.User32 = ffi.Library('user32',{ 'GetWindowLongPtrW': ['int',['int','int']],'SetWindowLongPtrW': ['int','int','long']],'GetSystemMenu': ['int','bool']],'DestroyWindow': ['bool',['int']] });
const user32 = require('./app/scripts/user32').User32
win.once('ready-to-show',() => { let hwnd = win.getNativeWindowHandle() //获取窗口句柄。 user32.GetSystemMenu(hwnd.readUInt32LE(0),true); 禁用系统菜单. win.show() })