Node.js ffi доступ к dll - PullRequest
       13

Node.js ffi доступ к dll

0 голосов
/ 14 мая 2018

У нас есть оболочка 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, строки против буфера и т. Д ... нетудачи.Любая помощь или предложения приветствуются!

1 Ответ

0 голосов
/ 14 мая 2018

Не знаю почему, но обнаружил, что я могу запустить это успешно, если я запускаю его с правами администратора.Несколько других примечаний для этой конкретной библиотеки DLL:

  • Это 32-битная версия, поэтому вы должны работать с 32-битным Node.js
  • Переменная среды пути должна содержать путь к DLL (поэтомумогу найти его зависимости)

Надеюсь, это спасет кого-то еще от боли!

...