在nodejs里有兩種方式去調(diào)用dll文件:
第一種:如果有c++的開發(fā)經(jīng)驗(yàn)就可以直接看 Electron使用NodeJS擴(kuò)展模塊調(diào)用DLL貌似也是官方推薦的方法,nodejs官網(wǎng)也提供了相關(guān)文檔 文檔鏈接
第二種:通過node-ffi模塊,以下內(nèi)容都是講通過這個(gè)模塊去調(diào)用的,適合前端開發(fā)的同學(xué)
1.切換成淘寶源,安裝相關(guān)的環(huán)境依賴
python(v2.7 ,3.x不支持);
visual C++ Build Tools,或者 (vs2015以上(包含15))
-
.net framework 4.5.1
或者執(zhí)行
(推薦)npm install --global --production windows-build-tools(你們看哪個(gè)方便,我是選了這個(gè),會(huì)自動(dòng)把python和c++開發(fā)工具包都集成進(jìn)去)
2.安裝node-gyp
npm install -g node-gyp
接著安裝
npm install ffi --save
“好戲”開始了:
-
cannot find moudule(環(huán)境變量的路徑有問題)
image.png
node-gyp的其它使用者提出一種解決方案: node 版本 10.15以上結(jié)合著這個(gè)模塊會(huì)有路徑問題,解決方法需要回退node版本至8,或者對(duì)變量設(shè)置路徑
Windows: >set npm_config_node_gyp=C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js//我這里不能在powershell使用,命令不生效,cmd可以,這里設(shè)置你的實(shí)際路徑)
-
TLS驗(yàn)證錯(cuò)誤
image.png
https://github.com/nodejs/node-gyp/issues/695 (解決方案,取消TLS證書驗(yàn)證)set NODE_TLS_REJECT_UNAUTHORIZED=0依舊是個(gè)set 命令 -
error:MSB4019:未找到導(dǎo)入的項(xiàng)目...(嗯,貌似又是路徑的問題)
image.png
到這里我就放棄執(zhí)行 npm install ffi --save 這個(gè)命令了,我直接從git倉庫里面去拉這個(gè)模塊。(要是沒有該問題的話可以跳過此步驟)
git clone git://github.com/node-ffi/node-ffi.git
cd node-ffi
node-gyp rebuild //如果是在electron里面使用的話還需要加上參數(shù)
終于生成代碼了,沒有報(bào)錯(cuò)只是給了些警告,我這里沒有管它,直接把該文件夾copy到nodemodules中。
接著嘗試一下nodejs里能不能調(diào)用到dll文件里的方法。
在當(dāng)前目錄里新建一個(gè)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
執(zhí)行node app.js 應(yīng)該能在控制臺(tái)里看到返回值哦
PS :如果還不行可能是缺少ref ref-struct 還有bingdings模塊。按照提示下載即可,ref同ffi都需要在當(dāng)前目錄執(zhí)行 node-gyp rebuild 然后再copy文件夾到nodemodules目錄里。
-
如果直接在electron里面使用app.js的代碼會(huì)報(bào)如下的錯(cuò):
image.png
通過rebuild編譯出來的包node版本和electron里的Node版本不一致,在編譯這些包時(shí)應(yīng)該指定electron版本。
執(zhí)行node-gyp rebuild -target=4.2.3 -arch=x64 --dist-url=https://atom.io/download/electron后再把對(duì)應(yīng)的包放到nodemoudles里面去就好了。但是你們?cè)谥付╡lectron的版本時(shí)不要直接看package.json里的,我這里顯示的是^4.0.1,下載的模塊版本時(shí)>=4.0.1的所以不是實(shí)際的版本號(hào)。 -
在package.json里補(bǔ)充好之前通過rebuild后的依賴包信息,否則會(huì)報(bào)錯(cuò),據(jù)其他網(wǎng)友說是打包的時(shí)候會(huì)重新下載這些依賴
image.png
相關(guān)資料
https://blog.csdn.net/liyangyang08/article/details/78835847
https://blog.csdn.net/wang839305939/article/details/83780789