5

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

これでどこが間違っているのか誰にもわかりますか?

4

1 に答える 1

3

配列を含む構造体の場合: これらは、ArrayType のパラメーターとして指定されたサイズで定義する必要があります。

例えば:

ArrayType('char', 256) 

したがって、私の問題の修正は次のとおりです。

var MyConfig = StructType({
    'attribute' : 'int',
    'path' : ArrayType('char', 256)
})
于 2016-06-15T16:04:50.843 に答える