2016-05-16 168 views
1

我使用Node.js ffi插件來調用C++ DLL。用Node.js調用包含char數組的struct 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 
}) 

注意:下面是我稱之爲t的地方他從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) 
})