2016-05-16 86 views
1

Node.js ffiアドオンを使用してC++ DLLを呼び出しています。Node.jsのchar配列を含む構造体のC++ dllを呼び出す

問題は、私が供給している構造体にあります - それはchar配列を含んでいます - 私はこれを正しく設定しているとは思いません。 その結果、私はそのコンテンツにアクセスすることができません。

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 
}) 
C++ヘッダファイルから

ルーチンの定義

注:ここでは、彼は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)); 
}); 

誰にも私が間違っていると知っていますか?

答えて

0

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

ArrayType('char', 256) 

ので、私の問題の修正プログラムは以下の通りです:

var MyConfig = StructType({ 
    'attribute' : 'int', 
    'path' : ArrayType('char', 256) 
}) 
関連する問題