Actualmente estoy importando C++ .dll usando ffi-napi llamando directamente a las funciones en NodeJS, pero me obliga a definir todos los tipos de datos personalizados en NodeJS si quiero pasarlos como argumentos de función.
Estoy buscando un método alternativo para llamar a funciones desde un C++ .dll que use tipos de datos personalizados o un enfoque diferente con ffi-napi.
A continuación se muestra mi implementación actual usando ffi-napi:
Encabezado C++:
Enum1 some_function ( Enum2 var1, Struct1* var2, Struct1* var3, Enum3* var4); );NodoJS:
var ref = require('ref-napi'); var ffi = require('ffi-napi'); var Struct = require('ref-struct-napi'); var Enum = require('enum') var Union = require('ref-union-napi') var somelib = new ffi.Library("somedll.dll", { "some_function": [ Enum1, [Enum2, Struct1*, Struct1*, Enum3*] // ignore correctness for simplicity ]});Puedo definir los tipos de datos personalizados (Enum1, Struct1, Enum3, etc.) en NodeJS usando los módulos que se muestran arriba, ya que NodeJS no los admite de forma nativa. Incluso usando ref.refType(Type) para obtener punteros.
La dificultad es que estos tipos de Struct se pueden anidar. Por ejemplo, se define Struct1 en el encabezado de C++:
typedef struct Struct1 { Struct2 var1; Struct3 var2; Struct4 var3; };Struct1 tiene otras 3 Structs dentro. Solo mostraré cómo se define Struct4 en el encabezado de C++:
typedef struct Struct4 { Enum4 var1; Struct5 var2; Struct6 var3; union { Struct7* var4; Struct8* var5; Struct9* var6; Struct10* var7; };Estas estructuras también pueden contener algunos otros tipos de datos.
Cuando necesite llamar a alguna_función, tendré que pasar variables de los respectivos tipos de datos de argumento
somelib.some_function(Enum2Var, &Struct1Var1, &Struct1Var2, &Enum3Var); // ignore correctness for simplicityMe pregunto si existe una mejor implementación que tener que definir manualmente todos estos tipos de datos en NodeJS para usar correctamente estas funciones.