從零開始實現(xiàn)Electron應(yīng)用與C++應(yīng)用交互

最近項目需要將Electron應(yīng)用與C++應(yīng)用進(jìn)行通信本鸣,經(jīng)過調(diào)研后鸽粉,發(fā)現(xiàn)Nanomsg正合我胃口挣磨,選擇Nanomsg作為兩者之間的通信手段毕源。這里記錄下在Windows上開發(fā)的過程。

安裝干凈的Windows環(huán)境

考慮到是從零開始搭建環(huán)境鞋喇,我在Mac中安裝了一臺Win7 x64的虛擬機(jī)窃页。

安裝NodeJS

這里下載node.js最新版本啤覆。一步步安裝下來就好了徙鱼。
為了加快下載速度搀愧,使用淘寶NPM鏡像:
npm config set registry https://registry.npm.taobao.org

感謝阿貍大神的提醒!
不敢用cnpm了疆偿,使用cnpm后,node_modules里面都是文件夾的symbol link搓幌,無法復(fù)制到離線環(huán)境(墻中墻的環(huán)境是地獄模式)杆故,以下命令就不要使用了:
npm install -g cnpm --registry=https://registry.npm.taobao.org

安裝electron-vue腳手架

  1. https://github.com/SimulatedGREG/electron-vue克隆到本地
  2. 照著electron-vue首頁的說明來:
# Install vue-cli and scaffold boilerplate
npm install -g vue-cli
vue init ./electron-vue my-project

# Install dependencies and run your app
cd my-project
npm install
npm run dev
  1. 到此,electron應(yīng)用就可以使用了

安裝nanomsg模塊

直接在npm中安裝nanomsg溉愁,不過在electron中不能直接使用处铛,原因見https://electronjs.org/docs/tutorial/using-native-node-modules饲趋。

在有翻墻手段的情況下,使用以下方法進(jìn)行編譯(我以為這樣就可以了撤蟆,實際上沒有編譯成Electron對應(yīng)的版本奕塑,詳見下文):

  • npm install --save-dev electron-rebuild
  • npm install --save nanomsg

安裝過程由于環(huán)境不全,會出現(xiàn)以下錯誤:

  • 安裝nanomsg報錯家肯,缺少Python龄砰,安裝Python2.7。
  • 編譯nanomsg出錯讨衣,缺少C++編譯環(huán)境换棚,安裝VS2010。不幸的是反镇,編譯需要支持C++11的編譯器固蚤,VS2010只能支持部分C++11特性。安裝一個VS2015再試歹茶,編譯成功夕玩!

VS2013能夠編譯nanomsg,但是不能編譯對應(yīng)Electron 1.8.2的node模塊惊豺,所以安裝VS2015.

也可以不安裝Python和VS2015燎孟,在管理員權(quán)限下,在PowerShell中使用命令
npm install --global --production windows-build-tools
安裝可用的編譯工具扮叨,其實就是安裝了Python2.7和Visual Studio Build Tools缤弦。不過我編譯的時候出現(xiàn)了錯誤,待以后再研究原因:
未找到導(dǎo)入的項目“C:\Microsoft.Cpp.Default.props”彻磁。請確認(rèn) <Import> 聲明中的路徑正確碍沐,且磁盤上存在該文件。

編寫測試?yán)?/h4>

src/main/index.js下添加代碼:

var nano = require('nanomsg')
var s = nano.socket('req')
//連接C++程序地址
s.connect('tcp://192.168.3.67:12345')
s.send('hello c')

運行程序npm run dev時出現(xiàn)錯誤:
Uncaught Error: Could not locate the bindings file. Tried:

意識到是沒有將nanomsg編譯為對應(yīng)Electron版本(本機(jī)是1.8.2)的模塊問題衷蜓。

文章《electron 使用原生node 模塊》說可以通過運行命令解決:
node-gyp rebuild --target=1.6.5 --arch=x64 --dist-url=https://npm.taobao.org/mirrors/atom-shell --msvs_version=2015
感謝該文提供的思路累提!

不過查看了https://npm.taobao.org/mirrors/atom-shell上沒有1.8.2版本的文件,還是得從https://atom.io/download/electron上下載文件磁浇,地址為:

https://atom.io/download/electron/v1.8.2/iojs-v1.8.2.tar.gz
https://atom.io/download/electron/v1.8.2/SHASUMS256.txt
https://atom.io/download/electron/v1.8.2/win-x86/iojs.lib
https://atom.io/download/electron/v1.8.2/win-x64/iojs.lib

下載以后以URL上的文件結(jié)構(gòu)保存到v1.8.2的文件夾下斋陪。

自己搭建一個IIS服務(wù)器:

  1. 控制面板-程序和功能-打開或關(guān)閉Windows功能-Internet信息服務(wù)
  2. 將v1.8.2的目錄復(fù)制打開服務(wù)器目錄下C:\inetpub\wwwroot\置吓;
  3. 控制面板-管理工具-Internet信息服務(wù)(IIS)管理器中添加MIME類型.lib application/x-obj无虚,使得下載lib不會報錯。

重新編譯nanomsg模塊操作:

cd node_modules\nanomsg
..\.bin\node-gyp rebuild --target=1.8.2 --arch=x64 --target_arch=x64 --dist-url=http://localhost --msvs_version=2015

回到工程目錄衍锚,運行npm run dev就不再出錯了友题。

和C++通信

Electron里面的代碼上文已經(jīng)提過:

var nano = require('nanomsg')
var s = nano.socket('req')
//連接C++程序地址
s.connect('tcp://192.168.3.67:12345')
s.send('hello c')

C++例子里面的代碼:

#include <iostream>
#include <nanomsg/nn.h>
#include <nanomsg/reqrep.h>

using namespace std;

int main() {
    int s = nn_socket(AF_SP, NN_REP);
    int err = nn_errno();
    int rc = nn_bind(s, "tcp://0.0.0.0:12345");
    char buf[1000] = {0};
    for(;;){
        printf("wait next \n");
        int rc = nn_recv(s, buf, 1000, 0);
        if(rc < 0) {
            printf("error: %s\n", nn_strerror(nn_errno()));
        }
        printf("%s\n", buf);
    }
    return 0;
}

測試可以收到消息!

總結(jié)

只說重點:

  1. 要安裝Visual Studio 2015
  2. 要到https://atom.io/download/electron下載對應(yīng)Electron版本的文件
  3. 如果要復(fù)制到離線環(huán)境戴质,不使用cnpm
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末度宦,一起剝皮案震驚了整個濱河市踢匣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戈抄,老刑警劉巖离唬,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異划鸽,居然都是意外死亡输莺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門漾稀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模闲,“玉大人,你說我怎么就攤上這事崭捍∈郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵殷蛇,是天一觀的道長实夹。 經(jīng)常有香客問我,道長粒梦,這世上最難降的妖魔是什么亮航? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮匀们,結(jié)果婚禮上缴淋,老公的妹妹穿的比我還像新娘。我一直安慰自己泄朴,他們只是感情好重抖,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祖灰,像睡著了一般钟沛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上局扶,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天恨统,我揣著相機(jī)與錄音,去河邊找鬼三妈。 笑死畜埋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畴蒲。 我是一名探鬼主播由捎,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饿凛!你這毒婦竟也來了狞玛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤涧窒,失蹤者是張志新(化名)和其女友劉穎心肪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纠吴,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡硬鞍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戴已。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固该。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糖儡,靈堂內(nèi)的尸體忽然破棺而出伐坏,到底是詐尸還是另有隱情,我是刑警寧澤握联,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布桦沉,位于F島的核電站,受9級特大地震影響金闽,放射性物質(zhì)發(fā)生泄漏纯露。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一代芜、第九天 我趴在偏房一處隱蔽的房頂上張望埠褪。 院中可真熱鬧,春花似錦挤庇、人聲如沸钞速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玉工。三九已至,卻和暖如春淘菩,著一層夾襖步出監(jiān)牢的瞬間遵班,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工潮改, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留狭郑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓汇在,卻偏偏與公主長得像翰萨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糕殉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容