Вызов функции C из возвращенного указателя в NodeJS

Я пытаюсь вызвать функцию в NodeJS, которая была возвращена как указатель функцией, вызываемой через ffi. Я получаю ошибку сегментации. Что я делаю не так?

Импортированная функция ffi получает указатель на char в качестве аргумента (который сообщает, на какую функцию должен указывать возвращаемый указатель), а затем возвращает указатель на void. В объявлении ffi.Library я пробовал много возвращаемых типов, т.е.: ref.types.void; ref.reftype(ref.types.void) и теперь я использую ref.refType(getDevList), это тип моей функции.

Функция С:

void *GetFunctionAddress(const char* fctName)
{
  void *address;
  ...
  return address;
}

Код NodeJS:

var ffi = require('ffi');
var Gateway;

var DeviceList = StructType({
    deviceNumber: ref.types.uint16,
}) 
DeviceList.defineProperty('device', 
ArrayType(ref.refType(DeviceList)))

var deviceListPtr = ref.refType(DeviceList);
var getDevList = ffi.Function(deviceListPtr, []);

Gateway = ffi.Library('./GatewayManager.so', {

  'InitializeGateway': ['bool',['void']],
  'ReloadConfig' : ['void',['void']],
  'ReadPar' : ['uint',['uint','uint','uint', dwordType]],
  'WritePar' : ['uint',['uint','uint','uint', dwordType]],
  'GetDatablockAddress' : [wordType,['uint','uint','uint']],
  'GetFunctionAddress' :  [ref.refType(getDevList),['char *']]

});

var retPtr =                 
Gateway.GetFunctionAddress(ref.allocCString('GetDevList'));
var GetDevList = retPtr.deref();
var DeviceListPtr = GetDevList();
res.send(DeviceListPtr);
console.log(DeviceListPtr);

Я получаю ошибку сегментации, когда в коде есть следующая строка:

var DeviceListPtr = GetDevList();

person Jardel Candido    schedule 15.08.2019    source источник


Ответы (1)


Вам не нужно ref.refType() в следующей строке:
'GetFunctionAddress' : [ref.refType(getDevList),['char *']]
Замените на:
'GetFunctionAddress' : [getDevList,['char *']]
Это должно работать.

person Tiller Belotti Júnior    schedule 19.08.2019