亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

Nodejs調用Dll模塊的方法

2024-05-06 16:46:09
字體:
來源:轉載
供稿:網友

公司項目采用Electron(electronjs.org/ )開發pc應用,會涉及到與底層硬件設備的通信,而sdk封裝 基本上都是通過 C++ 動態鏈接庫dll實現的。

有兩種方案可供選擇:

  • 方案一: 使用node-ffi
  • 方案二: 使用C++編寫一個node addon,通過LoadLibrary調用dll

以上兩種方案都可以解決dll調用問題,方案選型要個人對C++ 的掌握程度,如果熟悉C++開發,可以直接選擇方案二最方便。如果完全不了解C++,那么只能采用方案一。

由于筆主不太懂C++,最終選擇第一種方案。

二、什么是node-ffi?

( www.npmjs.com/package/ffi

node-ffi是使用純JavaScript加載和調用動態庫的node addon,它可以用來在不寫任何C++代碼的情況下調用動態鏈接庫的API 接口。

ffi究竟干了什么?其實它本質上還是一個編譯后的Node addon,node_modules/ffi/build/Release/ffi_bindings.node, ffi_bindings.node就是一個addon ffi充當了nodejs和dll之間的橋梁。

下面是一個簡單的加載dll的demo實例:

var ffi = require('ffi');var libpath = path.join(_dirname, '/test.dll');var testLib = ffi.Library(libpath, { 'start': ['bool', ['bool']]});testLib.start(true); // true

三、安裝node-ffi

npm install ffi

如果本地沒有安裝編譯node addon的環境會報錯,如下圖所示

無論是使用ffi,還是直接寫node addon,都缺少不了編譯node Addon這個步驟,要編譯node addon,有兩種方法:

1、node-gyp( www.npmjs.com/package/nod … )。

npm install node-gyp

具體安裝參考:github.com/nodejs/node…

總結來說需要以下四點:

python 2.7-3.0版本之間 (推薦裝v2.7,v3.x.x是不支持的)

NET Framework 4.5.1

Visual C++編譯工具 (在windows中是不需要安裝VS,如果自己安裝例如VS2015,導致編譯報錯error MSB4132: The tools version "2.0" is unrecognized. Available tools versions are "4.0".這個問題,說明沒有裝好編譯器,又或者編譯器沒有被正確地識別, node-gyp的文檔建議使用npm config set msvs_version 2015, 但是有些機器即使這樣設置了也無效,需要手動設置msvs_version, 應該這樣寫: node-gyp rebuild --msvs_version=2015。如果因為安裝了VS2015導致無法正常編譯,可直接恢復到安裝VS之前的還原點)
環境變量配置。(注:python安裝位置需要添加到環境變量)

2、electron-rebuild( www.npmjs.com/package/ele… )

如果采用electron開發應用程序,electron同樣也支持node原生模塊,但由于和官方的node 相比使用了不同的 V8 引擎,如果你想編譯原生模塊,則需要手動設置electron的headers的位置。

electron-rebuild為多個版本的node和electron提供了一種簡單發布預編譯二進制原生模塊的方法。 它可以重建electron模塊,識別當前electron版本,幫你自動完成了下載 headers、編譯原生模塊等步驟。 一個下載 electron-rebuild 并重新編譯的例子:

npm install --save-dev electron-rebuild# 每次運行"npm install"時,也運行這條命令./node_modules/.bin/electron-rebuild# 在windows下如果上述命令遇到了問題,嘗試這個:./node_modules/.bin/electron-rebuild.cmd

詳情請看 electronjs.org/docs/tutori…

這里需要注意nodejs版本問題,nodejs平臺必須跟dll保持一致,同樣是32位或者64位,如果兩者不一致,會導致調用dll失敗。

成功安裝ffi模塊之后,就可以開始我們下面的ffi調用dll的實例應用。

四、應用舉例

在開發需求中,需要調用基于C++編寫的TCP數據轉發服務的SDK。

首先我們來看一下dll頭文件接口聲明的代碼如下:

#ifndef JS_CONNECTION_SDK#define JS_CONNECTION_SDK#ifdef JS_SDK#define C_EXPORT __declspec(dllexport)#else#define C_EXPORT __declspec(dllimport)#endifextern "C"{  typedef void(*ReceiveCallback) (int cmd, int seq, const char *data);  /*設置讀取數據回調*/  C_EXPORT void _cdecl SetReceiveCallback(ReceiveCallback callback);  /*  *設置option  */  C_EXPORT void _cdecl SetOption(    const char* appKey,     const char* tk,    int lc,     int rm  );  /*  *創建連接  */  C_EXPORT bool _cdecl CreateConnection();  /*發送數據*/  C_EXPORT bool _cdecl SendData(int cmd, int seq, const char *data, unsigned int len);  /*釋放連接*/  C_EXPORT void _cdecl ReleaseConnection();}#endif

ffi調用dll模塊封裝,代碼如下:

try { const ffi = require('ffi'); const path = require('path'); const Buffer = require('buffer').Buffer; const libpath = path.join(APP_PATH, '..', '..', '/testSDK.dll');  const sdkLib = ffi.Library(libpath, { 'CreateConnection': ['bool', []], 'SendData': ['bool', ['int', 'int', 'string', 'int']], 'ReleaseConnection': ['void', []], 'SetOption': ['void', ['string', 'string', 'int', 'int']], 'SetReceiveCallback': ['void', ['pointer']] });  module.exports = { createConnection: function(){  sdkLib.CreateConnection(); }, setReceiveCallback(cb) {  global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){  cb && cb(cmd, seq, data && JSON.parse(data));  });  sdkLib.SetReceiveCallback(global.setReceiveCallback); }, sendData: function(cmd, seq, data){  data = JSON.stringify(data);  sdkLib.SendData(cmd, seq, data, data.replace(/[^/x00-/xff]/g, '000').length, 0); }, releaseConnection: function(){  sdkLib.ReleaseConnection(); }, setOption: function (option) {  sdkLib.SetOption(  option.appKey,  option.tk,  option.lc,  option.rm  ); } } } catch (error) { log.info(error);}

第一步:通過ffi注冊dll接口

const sdkLib = ffi.Library(libpath, { 'CreateConnection': ['bool', []], 'SendData': ['bool', ['int', 'int', 'string', 'int']], 'ReleaseConnection': ['void', []], 'SetOption': ['void', ['string', 'string', 'int', 'int']], 'SetReceiveCallback': ['void', ['pointer']] }); 

ffi.Library方法,第一個參數傳入dll路徑,第二參數JSON對象配置相關接口。

key對應dll頭文件中輸出的接口,例如C_EXPORT bool _cdecl CreateConnection();

value array配置參數類型,array[0]注冊接口函數返回值類型,array[1]注冊接口函數傳入形參類型。

1、基礎參數類型bool, char, short, int, long等。

2、指針類型,需要引入ref模塊,如下:

var ref = require('ref');var intPointer = ref.refType('char');var doublePointer = ref.refType('short');var charPointer = ref.refType('int');var stringPointer = ref.refType('long');var boolPointer = ref.refType('bool');

3、回調函數指針pointer,可以通過ffi.Callback創建,如下:

global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){ cb && cb(cmd, seq, data && JSON.parse(data)); });sdkLib.SetReceiveCallback(global.setReceiveCallback);

回調函數參數類型配置與dll接口參數類型配置相同,這里就不多說。

這里需要注意一點,回調函數可能會被JavaScript垃圾自動回收機制回收,所以我這里是把回調函數掛載到全局對象global上。

第二步:接口調用

通過ffi.Library(libpath, {...})注冊接口,可以直通過返回的sdkLib對象調用對接的接口。例如:

var bool = sdkLib.CreateConnection();console.log(bool); // true or false;var cmd = 0, seq = 0, data = {...};var dataStr = JSON.stringify(data);// JavaScript中文字符長度在C++中長度計算要*3sdkLib.SendData(cmd, seq, data, data.replace(/[^/x00-/xff]/g, '000').length);global.setReceiveCallback = ffi.Callback('void', ['int', 'int', 'string'], function(cmd, seq, data){ cb(cmd, seq, data && JSON.parse(data));});sdkLib.SetReceiveCallback(global.setReceiveCallback);

補充:下面看下NodeJS通過ffi調用DLL

第一步建立一個dll, 提供方法如下

int WINAPI CAM_Open(char *pIn, char* pOut);

第二步安裝ffi (前提已安裝python2.x環境)

npm install --save ffi

第三步創建測試文件

var ffi = require("ffi")var DLL = ffi.Library('FaceRecognition.dll', {  'CAM_Open' : ['int', ['string', 'string']]});var result = DLL.CAM_Open("", "");console.log(result)

參考資料

https://github.com/node-ffi/node-ffi

總結

以上所述是小編給大家介紹的Nodejs調用Dll模塊的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品18videos性欧美| 97av在线播放| 精品国产美女在线| 欧美日韩国产在线播放| www.久久久久久.com| 日韩精品免费视频| 亚洲一区二区久久久| 亚洲在线第一页| 久久亚洲精品视频| 欧美精品成人在线| 欧美性猛交xxxx乱大交蜜桃| 国产精品成人一区二区三区吃奶| 欧美丝袜美女中出在线| 欧美插天视频在线播放| 日本国产高清不卡| 正在播放欧美视频| 日韩av在线网站| 国产精品av免费在线观看| 91国语精品自产拍在线观看性色| 亚洲精品久久久久久久久久久久| 欧美在线日韩在线| 欧美大片免费观看在线观看网站推荐| 国产欧美在线播放| 亚洲第一天堂无码专区| 日韩电影在线观看中文字幕| 久久视频国产精品免费视频在线| 日韩成人免费视频| 亚洲美女中文字幕| 亚洲第一区在线| 精品久久久免费| 国产激情久久久久| 狠狠色狠狠色综合日日五| 深夜福利国产精品| 久久精品中文字幕| 亚洲美女又黄又爽在线观看| 欧美黑人性生活视频| 欧美一级淫片videoshd| 日韩视频第一页| 亚洲视频精品在线| 97国产精品人人爽人人做| 原创国产精品91| 国内精品久久久久伊人av| 粉嫩av一区二区三区免费野| 国产精品99蜜臀久久不卡二区| 亚洲国产精品人久久电影| 国产精品免费小视频| 亚洲日韩中文字幕| 欧美一区二区三区免费视| 国产日韩欧美夫妻视频在线观看| 亚洲美女性生活视频| 久久精品91久久香蕉加勒比| 国产精品免费看久久久香蕉| 国产97色在线|日韩| 日韩欧美在线视频| 国产成人鲁鲁免费视频a| 国产精品欧美日韩| 国产精品扒开腿做爽爽爽视频| 亚州成人av在线| 91九色单男在线观看| 欧美国产日韩一区二区| 2019中文字幕免费视频| 久久精品久久久久| 成人做爰www免费看视频网站| 亚洲国产中文字幕久久网| 国产视频在线观看一区二区| 久久99亚洲热视| 久久激情五月丁香伊人| 欧美性猛交xxxx乱大交蜜桃| 国产成人精品视频在线| 在线精品高清中文字幕| 成人性生交大片免费观看嘿嘿视频| 日韩电影免费观看在线| 成年人精品视频| 国产欧美精品一区二区三区-老狼| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩一区二区在线| 久久久久久久999精品视频| 在线视频欧美日韩| 91av在线播放| 91免费电影网站| 韩国日本不卡在线| 中文字幕欧美精品日韩中文字幕| 日韩欧美成人区| 大量国产精品视频| 日韩精品久久久久久福利| 国产欧美日韩丝袜精品一区| 国产精品高潮呻吟久久av黑人| 在线电影中文日韩| 成人黄色在线免费| 国产成人久久久精品一区| 尤物tv国产一区| 日本欧美黄网站| 日韩精品在线免费观看| 日韩有码片在线观看| 欧美亚洲成人免费| 亚洲欧美日本另类| 成人做爰www免费看视频网站| 欧美整片在线观看| 国内精品400部情侣激情| 亚洲第一网站男人都懂| 精品欧美aⅴ在线网站| 亚洲第一精品福利| 2019日本中文字幕| 日韩国产高清视频在线| 久久久久久这里只有精品| 欧美日韩成人精品| 亚洲欧美一区二区精品久久久| 久久久噜噜噜久久中文字免| 国产成人福利网站| 97福利一区二区| 国内精品小视频在线观看| 久久精品国产一区二区电影| 亚洲国产成人av在线| 欧美激情中文字幕在线| 亚州av一区二区| 91爱爱小视频k| 秋霞午夜一区二区| 国产精品偷伦视频免费观看国产| 国产精品久久久精品| 久久亚洲精品网站| 777午夜精品福利在线观看| 久久久噜噜噜久久中文字免| 亚洲系列中文字幕| 日产日韩在线亚洲欧美| 2018日韩中文字幕| 韩国美女主播一区| 久久久免费观看视频| 日产精品久久久一区二区福利| 久久人人爽人人| 久久久精品国产网站| 色中色综合影院手机版在线观看| 欧美一区三区三区高中清蜜桃| 国产精品久久色| 日韩电影中文字幕在线| 国产精品久久久久久av| 亚洲国产高清福利视频| 亚洲精选中文字幕| 亚洲视频在线观看| 成人黄色大片在线免费观看| 久久不射热爱视频精品| 亚洲区在线播放| 午夜精品久久久久久久久久久久| 亚洲国产天堂久久综合网| 中文字幕日韩综合av| 亚洲国产成人久久综合| 欧美激情免费在线| 美女av一区二区三区| 4438全国成人免费| 一区二区三区回区在观看免费视频| 在线播放日韩av| 亚洲图片欧美日产| 欧美激情视频网址| 久久久之久亚州精品露出| 日本精品久久久久影院| 欧美激情在线有限公司| 精品亚洲一区二区| 国产在线精品成人一区二区三区| 九色精品美女在线| 亚洲影视中文字幕| 欧美黑人一级爽快片淫片高清| 日本欧美一级片| 精品久久香蕉国产线看观看gif| 精品国产精品自拍| 欧洲精品毛片网站|