node.js - 如何在 Electron + Node -ffi-napi中获得正确的 native 内存地址

标签 node.js electron memory-address ffi node-ffi

如果我直接使用Node.js,我可以得到正确的 native 内存地址,例如:

// eg. native dll writen in rust; Of course, this part can be implemented in C or C++ or any others.
#[no_mangle]
pub unsafe extern fn example_concat(
  a: *const c_char,
  b: *const c_char
) -> *mut c_char
{
  let sa = CStr::from_ptr(a).to_str().expect("cannot to_str from a");
  let sb = CStr::from_ptr(b).to_str().expect("cannot to_str from b");
  let sr = format!("{}{}", sa, sb);
  let cr = CString::new(sr).expect("cannot create cr from sr");
  println!("[from native lib] cr={} *=0x{:X}", cr.to_str().expect("cannot to_str from cr"), cr.as_ptr() as c_ulonglong);
  cr.into_raw()
}

// tester.js
const ffi = require('ffi-napi');
const ref = require('ref-napi');
const str = ref.types.CString;
const lib = ffi.Library( 'lib.dll', { 'example_concat': [ "char *", [ str, str ] ] } );
const buffer = lib.example_concat( "su", "shi" );
console.log( '[from tester.js]', buffer.hexAddress(), buffer.readCString() );
node tester.js的结果是:

[from native lib] cr=sushi *=0x1E7B3B3E8C0
[from tester.js] 000001E7B3B3E8C0 sushi

可以预料,没有问题。但是,如果我将类似的FFI方法与react-electron系统一起使用,问题就会发生在我身上。

// App.js in react-electron Node.js project
const remote = window.require('electron').remote;
const ffi = remote.require( 'ffi-napi' );
const ref = remote.require( 'ref-napi' );
const str = ref.types.CString;
const lib = ffi.Library( 'lib.dll', { 'example_concat': [ "char *", [ str, str ] ] } );
const buffer = lib.example_concat( "su", "shi" );
console.log( '[from App.js(electron)]', ref.hexAddress( buffer ), ref.readCString( buffer ) ); // <-- It returns wrong memory address!!

该 Electron 版本的结果是:

[from native lib] cr=sushi *=0x2BFA2F07A10
[from App.js(electron)] 000002BFA3BA7230 sushi

如何使用electron在项目中获取正确的 native 内存地址?

  • os = Microsoft Windows 10(64位)10.0.19041.153
  • Node = 13.5.0
  • node-ffi-napi = 2.4.7
  • node-ffi-ref = 1.4.3
  • react = 16.13.0
  • Electron = 8.1.1
  • 最佳答案

    我得到了这种情况的答案。在发布的情况下,我使用了nodeIntegration: true,然后使用const remote = window.require('electron').remoteremote.require功能实现了该示例。然后,通过AddressForArgsref.HexAddress(†1)可能返回基于 Electron 客户端的地址(我现在不知道node-ref-napi,node-ffi-napi和 Electron 的更多内部信息)。

    因此,我尝试使用nodeIntegration: false功能更改preload设置。

    // preload.js
    window.ffi = require( 'ffi-napi' );
    window.ref = require( 'ref-napi' );
    

    // App.js ( Fixed to the preload feature based )
    // const remote = window.require('electron').remote;
    const ffi = window.ffi; //remote.require( 'ffi-napi' );
    const ref = window.ref; //remote.require( 'ref-napi' );
    

    然后,它可以正常工作!干得好,恭喜我!!

    (†1):https://github.com/node-ffi-napi/ref-napi/blob/ed19a20370394b0b1914566f4ea9b5354b475732/src/binding.cc#L72

    关于node.js - 如何在 Electron + Node -ffi-napi中获得正确的 native 内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60758366/

    相关文章:

    c++ - 返回 vector 元素 C++ 的地址

    node.js - 使用 alexa-sdk 在线编辑 Amazon Lambda 函数

    javascript - 成功安装electronic js时出现问题

    macos - 如何在 OSX 中为选定的文本注册右键菜单?

    assembly - 超出 4K(页面大小)的指令如何以 base + offset 样式处理?

    c++ - C++中动态二维数组中的地址

    node.js - 删除azure服务总线队列消息?

    javascript - 为什么我无法从 Node JS 的 http 服务器获得前几个响应?

    node.js - Centos 7安装strongloop报错

    node.js - 构建后无法使用 Electron 找到模块 NodeJ