web-dev-qa-db-ja.com

Node.jsネイティブモジュールは有効なWin32アプリケーションエラーではありません

Node.jsのHello Worldネイティブモジュールを作成しようとしています

1つのファイルでVS 2012のWin32プロジェクトを取得:

#include <node.h>
#include <v8.h>

using namespace v8;

Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("world"));
}

void init(Handle<Object> target) {
  target->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)

これはhello.nodeにコンパイルされます。
オプション:
-ダイナミックライブラリ(.dll)
-共通言語ランタイムサポートなし

次のように使用します。

hello = require './hello'
console.log hello.hello()

ローカルマシンで動作します(win8 x64、ノード:0.8.12)
しかし、リモートサーバー(Windowsサーバー2008 x64、ノード:0.8.12、iisnode:0.1.21 x64、iis7)では、次のエラーがスローされます。

アプリケーションがキャッチされない例外をスローして終了しました:エラー:
%1は有効なWin32アプリケーションではありません。

C:\ inetpub\test\lib\server\hello.node
at Object.Module._extensions..node(module.js:485:11)
at Module.load(module.js:356:32)
at Function.Module._load(module.js:312:12)
at Module.require(module.js:362:17)
at require(module.js:378:17)
オブジェクト。 (C:\ inetpub\test\lib\server\index.js:32:9)
at Module._compile(module.js:449:26)
at Object.Module._extensions..js(module.js:467:10)
at Module.load(module.js:356:32)
at Function.Module._load(module.js:312:12)

私が試したもの:
アプリプールの設定(win32アプリを有効にする)で遊んでも助けにはなりません。
iisnode x86はx64 osにインストールされません。
エラーのためにx64にコンパイルできません:エラー2エラーLNK1112:モジュールマシンタイプ 'X86'がターゲットマシンタイプ 'x64'と競合していますC:\ derby\hello\build\node.lib(node.exe ) こんにちは

誰か提案はありますか?

16

手遅れかどうかはわかりませんが、試行錯誤の結果、主に(私のマシンで)問題がWindowsでnodejsをコンパイルして、Visual C++を使用して拡張機能を作成できるという問題がありました。 nodejsをページからインストールしました。デフォルトのインストール(nodejsインストーラーによってPATHに追加されたもの)を使用してテストを実行しようとすると失敗しますが、コンパイル済みのnode.exe(コンパイルするためにコンパイルしたもの)を使用するとVisual C++でライブラリを参照できます)。

要約すると、問題は拡張機能ではなく、nodejsコンパイルにあります。コンパイルしたノードを使用し(VSソリューションを構築するには、そうしたと思います)、リモートマシンで動作するはずです。

注:この問題は、64ビットでコンパイルされたnode.exeを使用して32ビットのDLLを実行していることに依存しています。そのため、32ビットでnode.exeを使用すると機能するはずです。 (少なくとも私の問題は解決しました)

13
Cross

ちょうど同じ問題があり、私のノードとアドオンのアーキテクチャは同じであるにもかかわらず、同様のエラーメッセージが表示されました。ノード実行可能ファイルの名前を変更できないことがわかりました。 node.exe、私は同時に複数のバージョンをテストしようとしていたので、それらを独自のフォルダに入れなければなりませんでした。その後はすべてうまくいきました。

0
Dave

あなたの問題とは無関係:同じエラーが発生します(Error: %1 is not a valid Win32 application)拡張子が「.node」のスクリプトを実行しようとしたとき。 node.exe example.node。その他の拡張子(.js、.txt、拡張子なし)は問題なく機能します。

0
Robert Calhoun

私の場合、問題は、Linuxを使用して(Windows用に)構築されたWindows上でElectronアプリを実行しようとしたことでした。 Windowsを使用して(Windows用に)ビルドして解決しました。

Windowsでビルドするには、次のコマンドを使用しました。

npm install --global-production windows-build-tools
npm install
npm run build:prod && electron-builder build --windows

最後のコマンドを実行するには、必要なelectron-builderを実行します。

npm install --save-dev electron-builder
0
Stefano Borzì