【electron】外語函數接口 FFI

? 目錄 ?

    • 🛫 導讀
      • 需求
      • 開發環境
    • 1?? FFI
      • 概念
      • 優點
      • 注意事項
    • 2?? 【廢棄】node-ffi
    • 3?? node-ffi-napi
      • 安裝(windows系統下)
      • 示例:MessageBoxA、NtSuspendProcess
    • 4?? node-win32-api
      • 安裝
      • 示例:查找窗口并設置窗口標題
    • 5?? hmc-win32
      • 安裝
      • 示例
    • 🛬 文章小結
    • 📖 參考資料

🛫 導讀

需求

C++開發中經常遇到使用腳本語言,如lua、python等,提供更為靈活的更新操作。而腳本調用dll,又得導出接口。為了不更新二進制代碼,往往通過ffi的形式,為腳本語言增加調用dll的功能。

electron同樣支持js調用原生模塊的功能(參考 Node 原生模塊 https://www.electronjs.org/zh/docs/latest/tutorial/using-native-node-modules)。然而為了更加豐富electron的功能,我們是否可以提供類似lua等腳本語言調用原生dll的接口能力呢?
這就是今天我們要講的FFI

開發環境

版本號描述
文章日期2023-12-10
操作系統Win11 - 21H2 - 22000.1335

1?? FFI

概念

Foreign Function Interface(外語函數接口,FFI)是指一種在不同編程語言之間調用函數的方式。FFI 可以使語言 A 的程序能調用由語言 B 編寫的函數,從而實現兩種語言之間的交互。FFI 可以使用用戶態庫或者內核態庫實現,并且可以在不同的操作系統上使用。FFI 的一般實現方式是通過在目標語言(如 C)中編寫一個封裝函數,然后在調用方語言中使用該封裝函數來調用目標函數。

優點

使用 FFI 有以下幾個優勢:

  • 跨語言調用:FFI 使得在不同編程語言之間進行函數調用成為可能。
  • 使用外部庫:FFI 使得可以調用外部庫中的函數,而不需要將其代碼集成到程序中。
  • 提高效率:FFI 使得可以調用由其他編程語言編寫的高效函數,提高程序的效率。
  • 利用已有的庫資源:FFI 使得可以利用已有的由其他語言編寫的庫資源,避免重復開發。

總之,FFI 是一種很靈活的技術,可以幫助程序員在不同編程語言之間進行函數調用,提高程序的效率和擴展性。

注意事項

盡管FFI有大量優勢,我們依然需要注意:

  • 如調用方和被調用方的類型
  • 參數和返回值的轉換
  • 調用方與被調用方的內存管理等問題。

2?? 【廢棄】node-ffi

網上搜索node ffi,會出現大量的關于庫node-ffi的文章,其git地址為https://github.com/node-ffi/node-ffi。
從git上可以看到,該庫已經從19年不再更新了,而node和electron的版本日新月異,經過測試,該庫在新版本的node中已經無法正常運行,可以完全放棄了。

3?? node-ffi-napi

通過github,小編發現了替代庫node-ffi-napi: https://github.com/node-ffi-napi/node-ffi-napi,該庫在node16及node18下測試均正常。

安裝(windows系統下)

步驟一:確保您已安裝所有必要的構建適合您平臺的工具node-gyp

步驟二:然后調用下面語句
npm install ffi-napi
注意這里,會發現不是node-ffi-napi,而是ffi-napi

示例:MessageBoxA、NtSuspendProcess

node-ffi-napi提供了對象Library,其構造函數生成dll對應的接口集合。
參數一為dll名稱
參數二為對象,表示所有要用到的api接口。

下面分別通過MessageBoxA演示UI能力,以及NtSuspendProcess掛起某進程。


import ffi from 'ffi-napi'function 測試ffi_napi() {var current = ffi.Library('user32.dll', {'MessageBoxA': [ 'int', [ 'int', 'int' , 'int' , 'int' ] ]});current.MessageBoxA(0,0,0,0); // 1234// NTSTATUS NTAPI NtSuspendProcess(HANDLE ProcessHandle)var ntdll = ffi.Library('ntdll.dll', {'NtSuspendProcess': [ 'int', [ 'int' ] ]});ntdll.NtSuspendProcess(-1);
}測試ffi_napi()

4?? node-win32-api

node-win32-api是基于node-ffi-napi的一個純js庫,封裝了部分接口和數據結構,方便用戶調用。
github地址:https://github.com/waitingsong/node-win32-api

安裝

npm install win32-api

示例:查找窗口并設置窗口標題

// **Find calc's hWnd, need running a calculator program manually at first**/*** Exposed modules:* Comctl32: Comctl32 from lib/comctl32/api* Kernel32: kernel32 from lib/kernel32/api* User32: user32 from lib/user32/api*/
import { Kernel32, User32 } from 'win32-api/promise'
import ref from 'ref-napi'const knl32 = Kernel32.load()
const user32 = User32.load()// const user32 = load(['FindWindowExW'])  // load only one api defined in lib/{dll}/api from user32.dllconst title = 'Calculator\0'    // null-terminated string
// const title = '計算器\0'    // null-terminated string 字符串必須以\0即null結尾!const lpszWindow = Buffer.from(title, 'ucs2')
const hWnd = await user32.FindWindowExW(0, 0, null, lpszWindow)assert((typeof hWnd === 'string' && hWnd.length > 0) || hWnd > 0)
console.log('buf: ', hWnd)// Change title of the Calculator
const res = await user32.SetWindowTextW(hWnd, Buffer.from('Node-Calculator\0', 'ucs2'))
if ( ! res) {console.log('SetWindowTextW failed')
}
else {console.log('window title changed')
}

5?? hmc-win32

hmc-win32 是中國香港的小哥寫的庫,實現了各種常用的函數的封裝,貌似對標自動化庫autoitX。
該庫通過C++實現的,功能十分豐富,作者自己說自測完善,可放心使用。
github地址:https://github.com/kihlh/hmc-win32

安裝

npm i hmc-win32

示例

枚舉進程列表:

import hmc from 'hmc-win32';function 測試hmc() {// console.log(hmc)let procList = hmc.Process.getDetailsList()console.log(procList)
}測試hmc()

🛬 文章小結

上述是對electron使用ffi擴展的各種嘗試,如若不滿足需求。
可通過Node 原生模塊開發自己需要的功能。其實ffi也是原生模塊的一個應用而已。

📖 參考資料

  • Node 原生模塊 https://www.electronjs.org/zh/docs/latest/tutorial/using-native-node-modules
  • 調用 c++原生 dll https://zh-sky.gitee.io/electron-vue-template-doc/Overview/advanced/ffi.html
  • node-win32-api https://github.com/waitingsong/node-win32-api
  • hmc-win32 https://github.com/kihlh/hmc-win32

ps: 文章中內容僅用于技術交流,請勿用于違規違法行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212827.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212827.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212827.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UE5數據傳遞-紋理貼圖

期待結果: 流程 1. 通過C寫入數據到紋理貼圖 2. 在材質中通過采樣能正確讀取寫入的數值 踩坑: 1. UE5之后,需要設置采樣類型,才能達到上圖效果,默認采樣類型做了插值計算 FColor中寫入 PF_B8G8R8A8 UTexture2D* Conve…

第四題:憧憬(JavaPythonC++實現)【第六屆傳智杯-新增場次-程序設計挑戰賽解題分析詳解復盤】

本文僅為【2023傳智杯-第二場】第六屆傳智杯程序設計挑戰賽-題目解題分析詳解的解題個人筆記,個人解題分析記錄。 本文包含:第六屆傳智杯程序設計挑戰賽題目、解題思路分析、解題代碼、解題代碼詳解(Java&Python&C++實現) 文章目錄 更新進度記錄第四題:憧憬(Java…

AI 繪畫 | Stable Diffusion 藝術二維碼制作

前言 這篇文章教會你如果用Stable Diffusion WEB UI制作藝術二維碼,什么是藝術二維碼呢?就是普通二維碼和藝術圖片融合后的二維碼圖片,如下圖所示。主要原理還是使用controlNet的control_v1p_sd15_qrcode_monster模型和光影模型control_v1p_sd15_brightness。 教程 準備…

【論文閱讀筆記】NeRF+Mip-NeRF+Instant-NGP

目錄 前言NeRF神經輻射場體渲染連續體渲染體渲染離散化 方法位置編碼分層采樣體渲染推導公式(1)到公式(2)部分代碼解讀相機變換(重要!) Mip-NerfTo do Instant-NGPTo do 前言 NeRF是NeRF系列的…

DIP——邊緣提取與分割

1.使用canny算法進行邊緣提取 本實驗比較簡單,基本思路是對原圖像進行一個高斯模糊處理,用于去噪,之后轉換為灰度圖,直接調用cv庫中的canny記性邊緣提取。若想直接得到彩色邊緣,則通過按位與操作,將原始彩色…

SQLMap進階使用

預計更新SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

ingress介紹和ingress通過LoadBalancer暴露服務配置

目錄 一.ingress基本原理介紹 1.將原有用于暴露服務和負載均衡的服務的三四層負載均衡變為一個七層負載均衡 2.controller和ingress 3.通過下面這個圖可能會有更直觀的理解 二.為什么會出現ingress 1.NodePort存在缺點 2.LoadBalancer存在缺點 三.ingress三種暴露服務的…

7-6 通訊錄排序

輸入n個朋友的信息&#xff0c;包括姓名、生日、電話號碼&#xff0c;本題要求編寫程序&#xff0c;按照年齡從大到小的順序依次輸出通訊錄。題目保證所有人的生日均不相同。 輸入格式: 輸入第一行給出正整數n&#xff08;<10&#xff09;。隨后n行&#xff0c;每行按照“…

基于JavaWeb+SSM+Vue微信小程序的科創微應用平臺系統的設計和實現

基于JavaWebSSMVue微信小程序的科創微應用平臺系統的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 Lun文目錄 1系統概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系統設計思想 1 2相關技術…

Linux Component概述和高通component的使用

1 Linux為什么要引入Component框架&#xff1f; 為了讓subsystem按照一定順序初始化設備才提出來的。 subsystem中由很多設備模塊&#xff0c;內核加載這些模塊的時間不確定。子系統內有些模塊是需要依賴其它模塊先初始化才能進行自己初始化工作(例如v4l2 subdev和v4l2 video …

kubebuilder開發operator

安裝kubebuilder前 需要有kubernetes環境和golang環境 官網&#xff1a;https://go.kubebuilder.io/ 安裝kubebuilder #下載 wget https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) #改名kubebuilder后加權限 chmod x kubebuilder #放到環境變量里 mv k…

【C語言程序設計】編寫簡單的C程序

目錄 前言 一、程序設計 二、程序改錯 三、程序完善 總結 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高興與大家相識&#xff0c;希望我的博客能對你有所幫助。 &#x1f4a1;本文由Filotimo__??原創&#xff0c;首發于CSDN&#x1f4da;。 &#x1f4e3;如…

unity 2d 入門 飛翔小鳥 死亡 顯示GameOver(十四)

1、添加Img create->ui->img 把圖片拖進去 2、和分數一樣、調整位置 3、修改角色腳本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//獲取小鳥&#xff08;剛體&#xff09;private Rigidbod…

【Apipost】批量刪除我的51CTO文章

文章目錄 一、序二、API分析三、Apipost測試四、腳本五、Apipost中完成 一、序 去年開始再51CTO同步更新文章&#xff0c;一年多過去了&#xff0c;只漲了3個粉絲。看了下這個平臺就是賣課、搞培訓的&#xff0c;退出了。決定把文章也刪除了&#xff08;有人私信我說專門注冊了…

ToolkenGPT:用大量工具增強LLM

深度學習自然語言處理 原創作者&#xff1a;cola 用外部工具增強大型語言模型(LLM)已經成為解決復雜問題的一種方法。然而&#xff0c;用樣例數據對LLM進行微調的傳統方法&#xff0c;可能既昂貴又局限于一組預定義的工具。最近的上下文學習范式緩解了這一問題&#xff0c;但有…

Shell 常用命令詳解-上

Shell 常用命令詳解-上 1.目錄查閱相關命令2.文件操作相關命令 1.目錄查閱相關命令 ll 命令 命令描述&#xff1a;ll命令用于顯示指定工作目錄下的內容。 命令格式&#xff1a;ll [參數] [目錄名]。 參數說明&#xff1a; 參數說明-a顯示所有文件及目錄&#xff08;包括隱藏文…

【機器學習】041_模型開發迭代過程

一、模型開發的一般步驟 1. 明確研究問題 確定問題的組成和結果&#xff0c;明晰問題是分類問題還是回歸問題 2. 決定系統總體架構 ①理解數據&#xff1a;采集&#xff08;爬取&#xff09;數據&#xff0c;生成&#xff08;導入&#xff09;數據&#xff0c;進行數據清洗…

代碼隨想錄二刷 |二叉樹 |101. 對稱二叉樹

代碼隨想錄二刷 &#xff5c;二叉樹 &#xff5c;101. 對稱二叉樹 題目描述解題思路 & 代碼實現遞歸法迭代法使用隊列使用棧 題目描述 101.對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,2,…

zcms企業官網建站系統源碼搭建-支持頁面自定義

1.支持mysql&#xff0c;sqlite&#xff0c;access三種數據庫。 2.模板和標簽與asp版的zzzcms通用。 3.asp版的zzzcms的access數據庫可直接使用。 4.支持手機站。 &#xff08;增刪改查不做描述&#xff09;&#xff1a; 網站信息 名稱&#xff0c;logo&#xff0c;微信&…

基于OpenCV的流水線包裝箱檢測計數應用(附源碼)

導 讀 本文主要介紹基于OpenCV的流水線包裝箱檢測計數應用,并給出源碼。 資源下載 完整代碼和視頻下載地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代碼如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…