使用Node.js中包含char数组的结构调用C++dll

Call C++ dll with struct containing char array from Node.js

本文关键字:结构 调用 C++dll 数组 char Node js 包含 使用      更新时间:2023-10-16

我正在使用Node.js ffi插件来调用C++DLL。

我遇到的问题是我提供的结构——它包含一个char数组——我认为我没有正确设置。因此,我无法访问内容。

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
})

注意:下面是我从Node.js调用DLL的地方——我认为这里没有问题,尽管我可能错了。

// 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));
});

有人知道我哪里做错了吗?

对于包含数组的结构:这些结构的定义应将其大小指定为ArrayType的参数。

例如:

ArrayType('char', 256) 

因此,我的问题的解决方案如下:

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