Как получить правильный адрес встроенной памяти в электронном + node-ffi-napi - PullRequest
0 голосов
/ 19 марта 2020

Я могу получить правильный адрес собственной памяти, если использую Node.js напрямую, например:

// 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!!

Результат этой электронной версии:

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

Как я могу получить правильный адрес собственной памяти в проекте с использованием electron?


  • os = Microsoft Windows 10 (64-разрядная версия) 10.0.19041.153
  • узел = 13,5. 0
  • node-ffi-napi = 2.4.7
  • node-ffi-ref = 1.4.3
  • реагировать = 16.13.0
  • электрон = 8.1.1

1 Ответ

0 голосов
/ 19 марта 2020

Я получил ответ по этому делу. В опубликованной ситуации я использовал nodeIntegration: true, а затем реализовал пример, использующий функции const remote = window.require('electron').remote и remote.require. Затем, AddressForArgs († 1) через ref.HexAddress возвращает электронный адрес клиента, возможно (сейчас я не знаю больше внутренних элементов node-ref-napi, node-ffi-napi и электрона).

Поэтому я попытался изменить настройку 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

...