Вызов C ++ dll со структурой, содержащей массив char из Node.js

Я использую Node.js FFI аддон для вызова C ++ DLL.

У меня проблема со структурой, которую я предоставляю — она ​​содержит массив символов — я не верю, что настроил это правильно.
В результате я не могу получить доступ к содержимому.

Определение процедуры из заголовочного файла C ++:

int GetSysConfig(MyConfig * config);

MyConfig Структура определяется в C ++ следующим образом:

typedef struct{
int attribute;
char path[256];
}MyConfig;

Мое соответствующее определение структуры Node.js:

var ffi = require('ffi');
var ref = require('ref');
var StructType = require('ref-struct');
var ArrayType = require('ref-array');

// This seems to be the problematic part?
var charArray = ArrayType('char');
charArray.length = 256;

var MyConfig = StructType({
'attribute' : 'int',
'path' : charArray
})

Примечание: ниже здесь я вызываю DLL из Node.js — я не думаю, что здесь есть проблема, хотя я могу ошибаться.

// Create a pointer to the config - we know we expect to supply this to the C++ routine.
var myConfigPtr  = ref.refType(MyConfig);

var lib = ffi.Library('my.dll', {
"GetSysConfig": ["int", [myConfigPtr]]
});

var myConfigObj = new MyConfig();

lib.GetSysConfig.async(myConfigObj.ref(), function(err, res) {
console.log("attribute: " + myConfigObj.attribute);
// This is always empty [] - when it shouldn't be.
console.log("path: " + JSON.Stringify(myConfigObj.path));
});

Кто-нибудь знает, где я с этим не так?

1

Решение

Для структур, содержащих массивы: они должны быть определены с их размером, указанным в качестве параметра для ArrayType.

Например:

ArrayType('char', 256)

Поэтому решение моей проблемы заключается в следующем:

var MyConfig = StructType({
'attribute' : 'int',
'path' : ArrayType('char', 256)
})
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]