Electron如何通過ffi-napi調(diào)用dll導(dǎo)出接口
electron使用ffi-napi環(huán)境搭建
附打包好的ffi-napi可以直接放到項(xiàng)目目錄下使用,避免以后麻煩
一、安裝node.js
Node.js官網(wǎng):https://nodejs.org/zh-cn/download,選擇LTS長期穩(wěn)定版本即可
需要注意Node.js 區(qū)分32和64位,32位版本只能加載32位的DLL,64位的版本只能加載64位的DLL
建議下載x64,nodejs的位數(shù)決定后續(xù)electron以及node-gyp的位數(shù),我剛開始想編譯win32但是一直編譯不通過報(bào)錯(cuò)
報(bào)錯(cuò):npm error ‘“call”’ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序列或批處理文件。
安裝教程參考:https://www.runoob.com/nodejs/nodejs-install-setup.html
本來我在這里勾選了自動(dòng)安裝Visual Studio Build Tools和Python。但是后面發(fā)現(xiàn)下載需要3G,太大了,而且我本來電腦上裝了VS2017,我想用自帶的,所以后面又取消安裝了。不知道這里直接安裝的話,會(huì)不會(huì)就少了后續(xù)很多麻煩。。。。
cmd命令行查看安裝已成功
二、安裝Electron
方法一:使用node原始包管理工具npm安裝。-g 全局安裝
npm install -g electron
方法二:使用淘寶提供的cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
然后使用cnpm安裝
cnpm install -g electron
安裝報(bào)錯(cuò):
CERT_HAS_EXPIRED 錯(cuò)誤通常是指在使用 HTTPS 協(xié)議進(jìn)行請(qǐng)求時(shí),SSL 證書已過期,導(dǎo)致請(qǐng)求失敗
解決https改為http
注意:直接使用npm install electron他會(huì)下載npm包管理中的較新版本的electron(例如v34.2.0)
在electron20.3.8之后調(diào)用C++動(dòng)態(tài)庫會(huì)出現(xiàn)
Error: Error in native callback
原因:Electron 21 及更高版本將啟用 V8 內(nèi)存隔離區(qū),這將對(duì)一些原生模塊產(chǎn)生影響。
解決方案:降低electron版本,目前論壇大部分使用20.3.8(20.3.8版本太舊,我使用npm到國外官方網(wǎng)站下載,一直下載不成功…最后使用cnpm安裝成功的)
cnpm install electron@20.3.8
三、安裝ffi-napi 安裝python
選擇最新版本python3.13.2 64位
下載地址:https://devguide.python.org/versions/
安裝時(shí)記得勾選寫入環(huán)境變量
安裝VS
VS2022 Community下載地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community
我安裝的是vs2022 community(官方網(wǎng)站上寫的,不知道專業(yè)版可不可行)
查看ffi-napi官網(wǎng)描述如下:
安裝 Visual C++ 構(gòu)建環(huán)境:
對(duì)于 Visual Studio 2019
或更高版本,請(qǐng)使用Visual Studio CommunityDesktop development with C++中的工作負(fù)載。對(duì)于
Visual Studio 2019 之前的版本,請(qǐng)使用選項(xiàng)安裝Visual Studio 構(gòu)建工具Visual C++ buildtools
論壇上看到的
我的系統(tǒng)時(shí)win10,并且我安裝VS2017時(shí)已經(jīng)安裝了Windows 10 SDK, 所以我取消了默認(rèn)的windows 11 SDK的安裝
安裝ffi-napi
此時(shí)安裝的軟件各個(gè)版本如下所示:
安裝ffi-napi時(shí)會(huì)用到node-gyp編譯工具,他對(duì)vs版本匹配非常嚴(yán)格
安裝成功!?。。?!
四、引用ffi-napi模塊
主進(jìn)程中:main.js
const { app, BrowserWindow, ipcMain} = require('electron'); const ffi = require('ffi-napi'); const ref = require('ref-napi'); const path = require('path'); const dllPath = path.join(__dirname, './test_api-x64.dll'); //test為dll中導(dǎo)出的接口,第一個(gè)int為返回值類型,第二、三個(gè)是參數(shù)類型 const libm = ffi.Library(dllPath, { 'test': ['int',[ 'int','int']] }); // 處理 IPC 消息 ipcMain.on('call-test', (event, args) => { const { a, b } = args; console.log('調(diào)用DLL函數(shù) test,參數(shù):', a, b); try { const result = libm.test(a, b); event.sender.send('test-result', { a, b, result }); } catch (error) { console.error('DLL調(diào)用失敗:', error); event.sender.send('error', { message: 'DLL調(diào)用失敗', details: error.message }); } });
渲染進(jìn)程render.js
const { ipcRenderer } = require('electron'); const button_test = document.getElementById('button_test'); const textBox_result = document.getElementById('textBox'); button_test.addEventListener('click', () => { const a = 5; const b = 6; ipcRenderer.send('call-test', { a, b }); }); ipcRenderer.on('test-result', (event, data) => { textBox_result.value = `test(${data.a}, ${data.b}) = ${data.result}`; }); ipcRenderer.on('error', (event, data) => { alert(`錯(cuò)誤: ${data.message}`); });
五、其他問題
我在安裝過程中遇到了各種各樣的問題,這里記錄一下,看是否用得到
1. 安裝ffi-napi報(bào)錯(cuò)。
npm install ffi-napi
gyp ERR! find VS gyp ERR! find VS msvs_version not set from command
line or npm config gyp ERR! find VS running in VS Command Prompt,
installation path is: gyp ERR! find VS “C:\Program Files
(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC” gyp
ERR! find VS - will only use this version gyp ERR! find VS could not
use PowerShell to find Visual Studio 2017 or newer gyp ERR! find VS
looking for Visual Studio 2015 gyp ERR! find VS - not found gyp ERR!
find VS not looking for VS2013 as it is only supported up to Node.js 8
gyp ERR! find VS gyp ERR! find VS
************************************************************** gyp ERR! find VS You need to install the latest version of Visual Studio
gyp ERR! find VS including the “Desktop development with C++”
workload. gyp ERR! find VS For more information consult the
documentation at: gyp ERR! find VS
https://github.com/nodejs/node-gyp#on-windows gyp ERR! find VS
************************************************************** gyp ERR! find VS gyp ERR! configure error gyp ERR! stack Error: Could not
find any Visual Studio installation to use gyp ERR! stack at
VisualStudioFinder.fail
(D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:121:47)
gyp ERR! stack at
D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:74:16
gyp ERR! stack at VisualStudioFinder.findVisualStudio2013
(D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:351:14)
gyp ERR! stack at
D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:70:14
gyp ERR! stack at
D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:372:16
gyp ERR! stack at
D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\util.js:54:7
gyp ERR! stack at
D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\lib\util.js:33:16
gyp ERR! stack at ChildProcess.exithandler
(child_process.js:390:5) gyp ERR! stack at ChildProcess.emit
(events.js:400:28) gyp ERR! stack at maybeClose
(internal/child_process.js:1088:16) gyp ERR! System Windows_NT
10.0.19045 gyp ERR! command “D:\soft\nodejs\node.exe” “D:\soft\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js”
“rebuild” gyp ERR! cwd D:\DemoCode\electronFFI\node_modules\ffi-napi
gyp ERR! node -v v14.21.3 gyp ERR! node-gyp -v v5.1.1 gyp ERR! not ok
npm WARN enoent ENOENT: no such file or directory, open
‘D:\DemoCode\electronFFI\package.json’ npm WARN electronFFI No
description npm WARN electronFFI No repository field. npm WARN
electronFFI No README data npm WARN electronFFI No license field.npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! ffi-napi@4.0.3
install:node-gyp-build
npm ERR! Exit status 1 npm ERR! npm ERR!
Failed at the ffi-napi@4.0.3 install script. npm ERR! This is probably
not a problem with npm. There is likely additional logging output
above.npm ERR! A complete log of this run can be found in: npm ERR!
C:\Users\weidongcao\AppData\Roaming\npm-cache_logs\2025-02-11T07_45_19_949Z-debug.log
這里是說node-gyp找不到vs build tools,先確認(rèn)你是否安裝了vs build tools,如果已經(jīng)安裝了,網(wǎng)上搜索會(huì)讓你配置各種環(huán)境變量,都沒什么用,其實(shí)就是當(dāng)前node-gyp版本和vs版本不匹配
2. 編譯x86報(bào)錯(cuò):’“call”’ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。
這個(gè)感覺是32位下的一個(gè)bug,我目前沒有找到解決方案
3. 如果安裝失敗,管理員運(yùn)行試一下 4. 實(shí)在不行就官網(wǎng)拉ffi-napi源碼,自己編譯
源碼地址:https://github.com/node-ffi-napi/node-ffi-napi
在ffi-napi目錄下直接編譯
node-gyp clean node-gyp configure --msvs_version=2022 node-gyp build
提示安裝addon
npm install node-addon-api
到此這篇關(guān)于Electron通過ffi-napi調(diào)用dll導(dǎo)出接口的文章就介紹到這了,更多相關(guān)Electron ffi-napi調(diào)用dll內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nodejs一個(gè)簡單的文件服務(wù)器的創(chuàng)建方法
這篇文章主要介紹了nodejs一個(gè)簡單的文件服務(wù)器的創(chuàng)建方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09運(yùn)行Node.js的IIS擴(kuò)展iisnode安裝配置筆記
這篇文章主要介紹了運(yùn)行Node.js的IIS擴(kuò)展iisnode安裝配置筆記,iisnode的擴(kuò)展可以把Node.js程序托管到IIS,托管之后也意味著可以使用IIS里面的各種功能,需要的朋友可以參考下2015-03-03詳解node.js平臺(tái)下Express的session與cookie模塊包的配置
本篇文章主要介紹了詳解node.js平臺(tái)下Express的session與cookie模塊包的配置,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04對(duì)mac下nodejs 更新到最新版本的最新方法(推薦)
今天小編就為大家分享一篇對(duì)mac下nodejs 更新到最新版本的最新方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05使用Node.js創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪問的方法
Node.js 是能夠在服務(wù)器端運(yùn)行 JavaScript 的開放源代碼、跨平臺(tái)運(yùn)行環(huán)境,這篇文章主要介紹了如何使用Node.js快速創(chuàng)建本地HTTP服務(wù)器并實(shí)現(xiàn)異地遠(yuǎn)程訪問,需要的朋友可以參考下2024-01-01express如何解決ajax跨域訪問session失效問題詳解
這篇文章主要給大家介紹了關(guān)于express如何解決ajax跨域訪問session失效問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問題詳解
這篇文章主要給大家介紹了關(guān)于node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)把。2017-10-10