У нас есть оболочка C # в dll, которую я хотел бы преобразовать в оболочку node.js для улучшений.Я не могу заставить функцию irSAInitialize возвращать дескриптор или успешный ответ.Это моя первая попытка использования ffi, но я считаю, что у меня все настроено правильно (похоже, работает другая функция в dll).
Вот простой код POC, который у меня есть, который пытается инициализировать, а затем записать результаты.
var ffi = require('ffi');
var ref = require('ref');
var intPtr = ref.refType('long');
var dllPath = "O:\\ApiBin\\";
var dllFile = dllPath + "irApiSA.dll";
var randConnect = ffi.Library(dllFile, {
'irSAInitialize': ['int', ['string', 'string', 'string', 'string', 'string', 'string', intPtr]],
'irUnInitialize': ['int', []]
});
var handleOut = ref.alloc('long');
var a=b=c=d=e=f="";
var result = randConnect.irSAInitialize(a, b, c, d, e, f, handleOut);
console.log("Init Result: " + result);
handle = handleOut.deref();
console.log("Init Handle: " + handle);
var uninitResult = randConnect.irUnInitialize();
console.log("Uninit Result: " + uninitResult);
И вот результаты, которые я вижу.Обратите внимание, что функция uninit, кажется, успешно возвращается (результат 1), поэтому она, кажется, имеет правильную связь с DLL.
Init Result: 0
Init Handle: 0
Uninit Result: 1
Вот соответствующая часть .h для ссылки
typedef long IR_HANDLE;
typedef enum {IR_FAILURE_CODE = 0, IR_SUCCESS_CODE = 1} IR_ERROR_CODE;
IR_DECL_SPEC IR_ERROR_CODE irSAInitialize (const char *szDARouterFilePath, const char *szDADataFilePath, const char *szRouterFilePath, const char *szMapFilePath, const char *szAdminFilePath, const char *szDataFilePath, IR_HANDLE *pirHandle);
Также для справки, здесь приведены фрагменты кода C #, который работает в существующем решении.
[DllImport("irApiSA.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int irSAInitialize(String a, String b, String c, String d, String e, String f, ref int handle);
...
char[] temp = new char[256];
String s = new String(temp);
int result = irSAInitialize(s, s, s, s, s, s, ref handle);
Я пробовал много вариантов использования int vs long, строки против буфера и т. Д ... нетудачи.Любая помощь или предложения приветствуются!