2015-10-07 12 views
5

Ich bin völlig neu in Node JS und Electron. Ich versuche C++ mit HTML zu verbinden, indem ich Electron und Node JS benutze. Ich habe ein paar Beispiele gegeben durch: GITCalling Node Native Addons (C++) in Elektron

Was ich versuche zu tun, ruft die native Funktion (Hallo()) von meiner Webseite Javascript, die von Elektronen geladen wird. Ich habe node-gyp configure verwendet, um meine Visual Studio-Lösungsdatei zu generieren. (.sln). Und später kompilierte ich meinen Code mit Visual Studio 2013 Express, der erfolgreich meine .node Datei in Build \ Release Folder generiert.

Das ist meine index.js Datei:

var addon = require('./build/Release/hello.node'); 
console.log(addon.hello()); 

, wenn ich das einfach laufen mit node index.js, es mir den gewünschten Ausgang geben:

world 

Aber das Problem kommt mit wenn ich Elektron. Ich benutze Elektronenbinär (32 Bit), um meine Webseite zu betreiben.

Hier finden Sie meine main.js Datei:

var app = require('app'); // Module to control application life. 
var BrowserWindow = require('browser-window'); // Module to create native browser window. 


require('crash-reporter').start(); 

var mainWindow = null; 

// Quit when all windows are closed. 
app.on('window-all-closed', function() { 
    if (process.platform != 'darwin') { 
    app.quit(); 
    } 
}); 

// This method will be called when Electron has finished 
// initialization and is ready to create browser windows. 
app.on('ready', function() { 
    mainWindow = new BrowserWindow({width: 1366, height: 768}); 
    mainWindow.loadUrl("file://" + __dirname + "/HtmlFile/index.html"); 
    mainWindow.on('closed', function() { 
    mainWindow = null; 
    }); 
}); 

Nun ist dies mein Javascript, wo ich das native Addon bin Aufruf:

//************* My Functional logic ************** 
//************************************************ 

var addon = require('../build/Release/hello'); 
alert(addon.hello()); 

Wenn ich diese ausführen oder diese laden Seite, erhalte ich den folgenden Fehler:

Uncaught Error: %1 is not a valid Win32 application. ATOM_SHELL_ASAR.js:137 
C:\Users\Administrator\Desktop\MyAPP\build\Release\hello.node 

Folgen ist mein package.json:

{ 
    "name": "MyAPP", 
    "version": "1.0.0", 
    "description": "Desc", 
    "main": "main.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "nan": "^2.0.9" 
    }, 
    "gypfile": true 
} 

Das ist mein binding.gyp:

{ 
    "targets": [ 
    { 
     "target_name": "hello", 
     "sources": [ "hello.cc" ], 
     "include_dirs": [ 
     "<!(node -e \"require('nan')\")" 
     ] 
    } 
    ] 
} 
+0

Ich bin in der gleichen Ausgabe läuft, wenn die '--arch = ia32' Flag verwendet Wenn ich die' verwenden - arch = x64 'flag Ich empfange 'Uncaught Error: Das System kann keinen Nachrichtentext für die Nachrichtennummer 0x% 1 in der Nachrichtendatei für% 2 finden. Wenn ich jedoch den Befehl mit' node./'ausführe, wird" world "ausgedruckt "Die Befehlszeile wie erwartet. Auch der gleiche Code funktioniert auf MacOS in Elektron, scheint also ein Windows-Elektron-basiertes Problem. – devonbleibtrey

Antwort

2

Es sieht aus wie Sie nicht die richtige binäre konfiguriert haben. Leider nicht sicher, ob dies für das native Modul arbeiten, aber man konnte rebuilding versuchen ...

Hinweis: Bitte versichern Sie die richtigen Argumente für Ihren Knoten-gyp Befehl (wenn das ist, wie Sie Rebuild) .

  • --target=<your electron version>
  • --target_platform=win32 (im Beispiel nicht Link, aber Sie scheinen Fenster zu verwenden)
  • --arch=<your architecture> (x64 = 64bit, x86 = 32bit)
+0

Ich habe keine solche Verzeichnisstruktur in meiner Entwicklungsumgebung gefunden. Ich verwende nur Elektronenbinär." um meine app zu betreiben. – user1636077

+0

Mein schlechtes. Ich sollte nicht versuchen, Fragen um 03.00 Uhr zu lesen. Ich habe meine Antwort aktualisiert. – Josh

2

Wie ich bereits in der genannten Kommentare Ich stieß auf das gleiche Problem. Um es zu beheben müssen Sie ein paar zusätzliche Flags hinzu:

node-gyp rebuild --target=<your electron version> --arch=<insert your arch> --dist-url=https://atom.io/download/atom-shell 

Dadurch werden die richtigen Anforderungen aus der atom.io Website erhalten und das Add-on korrekt aufzubauen. Für weitere Informationen können Sie die spezifischen docs von Elektronen überprüfen, wenn Sie native Module verwenden.

0

Verwendung von Node-Gyp direkt wird mit Nodejs Header erstellen, aber Elektron hat verschiedene Header.

Zuerst sollten Sie herausfinden, welche Elektronenversion das Elektron verwendet. Sie ein js ähnliche

console.log(process.version); 

Verwendung Elektron schreiben kann dieses Skript auszuführen, meine Version ist 0.36.1 und wechseln Sie in das Modul Sie

#On Windows Try this 
cd /path-to-module/ 
npm install bindings nan node-gyp 
node-gyp rebuild --target=0.36.1 --arch=x64 --dist- url=https://atom.io/download/atom-shell 
#notice the target version is the electron binary version 
1

Mein persönliches Problem bauen möchte in Bezug auf Knoten vs Elektronenköpfe in nativen Addons benötigt einen anderen Dist-URL-Parameterwert:

Ich hoffe, es wird jemandem helfen.

PS:. Immer noch nicht herausfinden können, wie es in den Fenstern mit .npmrc einzustellen (

+0

Setzen Sie dies in Ihre .npmrc in Ihrem Projekt Stammordner '' 'runtime = Elektron \ n TARGET_ARCH = x64/x86 \ n target = 1.7.9 \ n disturl = https://atom.io/download/atom- Shell \ n progress = true''' – niketan

+0

@niketan, aber wie würde ich dann für die alternative Architektur bauen? Ändern Sie die Datei jedes Mal? – Konstantin