質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

11105閲覧

Electronを使った環境でnode-ffiが動かない

prince_0203

総合スコア26

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2015/10/30 08:56

編集2015/10/31 00:09

###前提・実現したいこと
node.jsとElectronでソフトウェアを作っています。node-ffiを使い、DLLの呼び出しを行いたいのですが、require('ffi')とするとElectronのウィンドウは開くのですがJavascriptでエラーが発生しそれ以降のコードが実行されなくなってしまいます。

###スクリーンショット
エラー発生時のスクリーンショット

###エラーメッセージ
Chromium デベロッパーツール

C:\...\electron_ffi_test\node_modules\ref\node_modules\bindings\bindings.js:83 Uncaught Error: A dynamic link library (DLL) initialization routine failed. C:\...\electron_ffi_test\node_modules\ref\build\Release\binding.node

###ソースコード
package.json

json

1{ 2 "name": "electron_ffi_test", 3 "main": "main.js", 4 "author": "prince_0203", 5 "scripts": { 6 "start": "node_modules/.bin/electron ." 7 }, 8 "devDependencies": { 9 "electron-prebuilt": "^0.34.1", 10 "ffi": "^2.0.0", 11 "ref": "^1.2.0" 12 } 13}

main.js

javascript

1/*jshint node: true*/ 2 3var app = require('app'); 4var BrowserWindow = require('browser-window'); 5var mainWindow = null; 6app.on('window-all-closed', function() { 7 app.quit(); 8}); 9app.on('ready', function() { 10 mainWindow = new BrowserWindow({ 11 width: 640, 12 height: 480 13 }); 14 mainWindow.loadUrl('file://' + __dirname + '/index.html'); 15 mainWindow.on('closed', function() { 16 mainWindow = null; 17 }); 18});

index.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>electron_ffi_test</title> 6 <script src="index.js"></script> 7</head> 8<body> 9 <h1>Hello World!</h1> 10</body> 11</html>

index.js

javascript

1/*jshint browser: true, node: true*/ 2 3// ↓この部分があるとエラーが発生し、実行が中断されます。refだけでもffiだけでもエラーになります。 4var ref = require('ref'); 5var ffi = require('ffi'); 6 7alert('Hello, node-ffi and Electron!');

###再現方法
適当なフォルダを作成し上記のソースコードを保存してnpm installnpm startで実行できます。

###環境

  • Windows 10
  • node.js v4.2.1
  • npm v2.14.7

###補足
Electronを使用しない場合は以下のコードでDLLの呼び出しまで正しく動作します。

javascript

1/*jshint node: true*/ 2 3var ref = require('ref'); 4var ffi = require('ffi'); 5 6var user32 = ffi.Library('user32', { 7 'MessageBoxA': ['int', ['int', 'string', 'string', 'int']] 8}); 9user32.MessageBoxA(null, 'Hello world', 'Title', 0); 10console.log('Hello world');

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ちょっと調査不十分で検証もしていないので、見当違いなら申し訳ないのですが、

Error: A dynamic link library (DLL) initialization routine failed. on Windows · Issue #18 · atom/node-spellchecker
で類似の現象が報告されており、ここから参照されている
electron/using-native-node-modules.md at master · atom/electron
にある内容が役立たないでしょうか?

The native Node modules are supported by Electron, but since Electron is using a different V8 version from official Node, you have to manually specify the location of Electron's headers when building native modules.

とあり、Electronの使うV8は公式のNodeとは違うのでビルド時に指定する必要があるようです。

いくつか対応方法が書いてあって、
簡単な方法として、以下が挙がっているので試してみてはいかがでしょうか?

npm install --save-dev electron-rebuild # Every time you run "npm install", run this ./node_modules/.bin/electron-rebuild

投稿2015/10/30 23:03

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prince_0203

2015/10/31 00:08

回答ありがとうございます。提示していただいた方法で以下のように何度か試しましたがうまく動きませんでした。 1. npm install electron-rebuild --save-dev を実行 2. npm start で動作確認 → 状況変わらず 3. node_modules フォルダを削除し、npm install を実行 4. npm start → やはり変わらず
eripong

2015/10/31 00:10

./node_modules/.bin/electron-rebuild も実行されましたか?
prince_0203

2015/10/31 00:46

解決しました。./node_modules/.bin/electron-rebuildは実行していたのですが、フォルダのパスに日本語が含まれたためエラーが発生していました。 C:\直下にフォルダを作成し、そこで再度npm installおよび./node_modules/.bin/electron-rebuildを実行すると正しく動作するようになりました。ありがとうございます。
eripong

2015/10/31 00:48 編集

おお、よかったです。 これ、けっこうはまる人いそうですね。
horse_n_deer

2015/10/31 05:37

なるほど、日本語ですか…参考になります
guest

0

以前、ビルド後に似たような状況に遭遇したことがあります。

<script src="index.js"></script>

を、以下のコードに差し替えると動作しませんか?

js

1<script> 2 (function(){ 3 var path = require('path'); 4 require(path.join(__dirname, 'index.js')); 5 })() 6</script>

あるいは、<script>require('./index.js')</script>とするか。

イメージ説明

投稿2015/10/30 09:20

編集2015/10/30 11:57
horse_n_deer

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prince_0203

2015/10/30 09:27

回答ありがとうございます。 残念ながら、提示していただいた方法でも状況は変わりませんでした。
horse_n_deer

2015/10/30 10:41

Macで上記ソースコードを実行しましたが、エラーは出ず、Electronのウィンドウが立ち上がったんですよね… `node_modules`は`main.js`と同じ階層に破損せずインストール出来ていますか?
prince_0203

2015/10/30 11:33

言葉足らずで申し訳ありません。Electronのウィンドウは開くのですが、デベロッパーツール(Ctrl+Shift+I)を開くとエラーが表示されています。また、index.jsの require('ref') 以降のコードが実行されません。
horse_n_deer

2015/10/30 11:58

SSを追加しました。OSX上では正常に動作しています。
prince_0203

2015/10/30 22:30

質問にSSを追加しました。もしかするとWindows固有の問題かもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問