在电子和电子构建器中使用 ffi-napi 出现“本机回调错误”

guo*_*owy 7 javascript ffi node.js electron

我有一个简单的电子应用程序,试图用来ffi-napi调用 dll 文件,但在运行电子构建时收到“本机回调错误”。这是我的设置:

包.json

{
  "name": "electron-test",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "postinstall": "electron-builder install-app-deps",
    "dist": "electron-builder"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^23.1.2",
    "electron-builder": "^23.6.0"
  },
  "dependencies": {
    "ffi-napi": "^4.0.3"
  },
  "build": {
    "appId": "electron-test",
    "win": {
      "target": "portable"
    },
    "asar": false
  }
}
Run Code Online (Sandbox Code Playgroud)

main.js

const { app, BrowserWindow } = require('electron')
const ffi = require('ffi-napi');

const createWindow = () => {
    const win = new BrowserWindow({
        width: 800,
        height: 600,
    })

    win.loadFile('index.html')
}

app.whenReady().then(() => {
    createWindow()
})
Run Code Online (Sandbox Code Playgroud)

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
    <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
    <title>Hello from Electron renderer!</title>
</head>

<body>
    <h1>Hello from Electron renderer!</h1>
    <p></p>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

我按顺序运行了这些:

  1. npm i它安装模块并在ffi-napi包上运行构建脚本
  2. npm run start

并收到此错误:

App threw an error during load
Error: Error in native callback
    at process.func [as dlopen] (node:electron/js2c/asar_bundle:2:1822)
    at Module._extensions..node (node:internal/modules/cjs/loader:1259:18)
    at Object.func [as .node] (node:electron/js2c/asar_bundle:2:1822)
    at Module.load (node:internal/modules/cjs/loader:1044:32)
    at Module._load (node:internal/modules/cjs/loader:885:12)
    at f._load (node:electron/js2c/asar_bundle:2:13330)
    at Module.require (node:internal/modules/cjs/loader:1068:19)
    at require (node:internal/modules/cjs/helpers:103:18)
    at load (C:\workspace\temp\node_modules\node-gyp-build\node-gyp-build.js:22:10)
    at Object.<anonymous> (C:\workspace\temp\node_modules\ref-napi\lib\ref.js:8:53)
Run Code Online (Sandbox Code Playgroud)

我不确定如何解决这个问题,任何帮助将不胜感激。谢谢。

Waz*_*ime 9

这是 Electron 20.3.8 版本之后的一个 BUG/FEATURE。
该团队添加了一个沙箱,任何尝试使用指针从内存读取的内容(即已ref-napi被使用过的指针ffi-napi)都会使电子崩溃。

https://github.com/electron/electron/issues/35801
https://www.electronjs.org/blog/v8-memory-cage

目前,似乎唯一的解决方案是继续使用20.3.8版本,直到讨论结束。

解决方法可以是使用https://www.npmjs.com/package/@lwahonen/ffi-napi https://www.npmjs.com/package/@lwahonen/ref-napiffi-napi的分支ref-napi

如此处所述: https:
//github.com/node-ffi-napi/node-ffi-napi/issues/238#issuecomment-1461642322

但看来我们必须等到电子团队解决这个问题或者创建一个官方的解决方法。

  • 另一种解决方法是使用 Koffi NPM 包 (4认同)