在Node.js中使用ffi調用dll


類似的文章還是比較多的,但或多或少有一些問題沒有解決,在此我將其整合並分享給大家:

測試環境:
  • Node.js 9.9.0
  • VisualStudio 2015
  • "ffi": "gavignus/node-ffi#torycl/forceset-fix",
  • "ref": "1.3.5"
  • "ref-array": "1.2.0"
  • "ref-struct": "1.1.0"
  • "ffi-napi": "^2.4.3"
編譯失敗:

當前情況下編譯ffi會失敗,所以有兩種解決方法:

  1. 使用新的ffi-napi(api是一樣的,同時支持node.js新的napi)
  2. 使用第三方修改過的ffi,在package.json中,將ffi后面的版本號改成

"ffi": "gavignus/node-ffi#torycl/forceset-fix"

使用:
var ffi = require('ffi');

//第一個形參為dll所在位置(dll文件可以不用加.dll),第二個為函數信息
var libm = ffi.Library(__dirname + 'dllFile', {
    //函數名
    'fun': ['int', ['string', 'string']]
});

//調用
var str1="a";
var str2="b";
libm.fun(str1, str2);
使用c++里的類型

ref、ref-struct、ref-array、ref-union、ref-wchar
在npm查看使用方法,在此不做贅述。

運行時遇到的錯誤

1.c++代碼是可以用的,但是需要把代碼寫在extern "C"{}里,不過這個我沒有親自試過。
2.dll文件需要放到node.js 執行目錄,也就是

//即x:\xxxxx\xx
cd /d x:\xxxxx\xx;
node xxx.js;

3.dll如果有互相依賴的必須放全。不然只會出現錯誤126,而不會像一般程序那樣提示缺少xxx.dll。所以報錯了可以用depends看一下,dll全了沒。
4.dll的需要與node.js的平台相對應,比如你的node.js是64位版本的,那你的dll也需要使用64位編譯。

錯誤126:檢查上述1、2、3步。

參考:

wiki:
https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial

有問題在issue里搜下就好

https://www.jianshu.com/p/914103283ea0
https://blog.csdn.net/zhulin2609/article/details/51474676


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM