从 NodeJS 中返回的指针调用 C 函数
Calling C function from returned pointer in NodeJS
我正在尝试调用 NodeJS 中的一个函数,该函数由通过 ffi 调用的函数return编辑为指针。我遇到分段错误。我做错了什么?
ffi 导入函数获取一个指向 char 的指针作为参数(告知 returned 指针应指向哪个函数),然后 return 一个指向 void 的指针。在 ffi.Library 声明中,我尝试了很多 return 类型,即:ref.types.void; ref.reftype(ref.types.void) 现在我正在使用 ref.refType(getDevList),这是我的函数类型。
C函数:
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();
您不需要 ref.refType()
以下行:
'GetFunctionAddress' : [ref.refType(getDevList),['char *']]
将其更改为:
'GetFunctionAddress' : [getDevList,['char *']]
它应该有效。
我正在尝试调用 NodeJS 中的一个函数,该函数由通过 ffi 调用的函数return编辑为指针。我遇到分段错误。我做错了什么?
ffi 导入函数获取一个指向 char 的指针作为参数(告知 returned 指针应指向哪个函数),然后 return 一个指向 void 的指针。在 ffi.Library 声明中,我尝试了很多 return 类型,即:ref.types.void; ref.reftype(ref.types.void) 现在我正在使用 ref.refType(getDevList),这是我的函数类型。
C函数:
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();
您不需要 ref.refType()
以下行:
'GetFunctionAddress' : [ref.refType(getDevList),['char *']]
将其更改为:
'GetFunctionAddress' : [getDevList,['char *']]
它应该有效。