electron通過node-ffi調(diào)用dll文件

在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é)

image.png

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ù)
image.png

終于生成代碼了,沒有報(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容