18

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

1つのファイルでVS2012の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 Server 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)atFunction.Module
。 _load(module.js:312:12)
at Module.require(module.js:362:17)
at require(module.js:378:17)atObject
。(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アプリを有効にする)ことは役に立ちませんでした。
Iisnodex86はx64OSにインストールされません。
エラーのためx64にコンパイルできません:エラー2エラーLNK1112:モジュールマシンタイプ'X86'がターゲットマシンタイプ'x64'と競合していますC:\ derby \ hello \ build \ node.lib(node.exe)hello

誰か提案はありますか?

4

5 に答える 5

14

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

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

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

于 2012-11-27T20:08:26.280 に答える
0

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

于 2015-08-19T06:23:45.307 に答える
0

私の場合、問題は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
于 2020-02-27T22:16:44.693 に答える
0

ElectronForgewebpackタイプスクリプトボイラープレートを使用します。これは私のために働いたものです:

webpack.main.config.js追加でexternals: ['sqlite3']

module.exports = {
  /**
   * This is the main entry point for your application, it's the first file
   * that runs in the main process.
   */
  entry: './src/electron-entrypoint.ts',
  // Put your normal webpack config below here
  module: {
    rules: require('./webpack.rules'),
  },
  resolve: {
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.css', '.json']
  },
  externals: ['sqlite3']
};

ソース

あるいは、-それは私にとってもうまくいきました-、ここで提案されているように、より良い-sqlite3を使用することができます

于 2021-04-20T14:30:25.193 に答える
-2

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

于 2012-12-12T19:47:19.500 に答える