Node.js本机模块不是有效的Win32应用程序错误

时间:2012-10-23 17:10:55

标签: node.js native iisnode

尝试为node.js生成Hello World本机模块

在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 Server 2008 x64,节点:0.8.12,iisnode:0.1.21 x64,iis7),它会抛出此错误:

  

应用程序抛出未捕获的异常并终止:错误:
  %1不是有效的Win32应用程序。

     

C:\的Inetpub \测试\ lib中\服务器\ hello.node
      在Object.Module._extensions..node(module.js:485:11)
      在Module.load(module.js:356:32)
      在Function.Module._load(module.js:312:12)
      在Module.require(module.js:362:17)
      at require(module.js:378:17)
      在对象。 (C:\的Inetpub \测试\ lib中\服务器\ index.js:32:9)
      在Module._compile(module.js:449:26)
      at Object.Module._extensions..js(module.js:467:10)
      在Module.load(module.js:356:32)
      在Function.Module._load(module.js:312:12)

我尝试了什么:
使用应用程序池设置(启用win32应用程序)没有帮助 Iisnode x86不安装在x64操作系统上 由于错误,无法编译为x64:错误2错误LNK1112:模块机器类型'X86'与目标机器类型'x64'冲突C:\ derby \ hello \ build \ node.lib(node.exe)hello

有人有任何建议吗?

5 个答案:

答案 0 :(得分:13)

我不知道是否为时已晚,但我在一些试验和错误后找到了答案,主要是问题(在我的机器中)是我在windows上编译nodejs以便能够使用visual C ++创建扩展,并且我已经从页面安装了nodejs,如果我尝试使用默认安装(由nodejs安装程序添加到我的PATH)运行测试,那么它会失败,但是如果我使用已编译的node.exe(我是编译为能够引用Visual C ++中的库)然后它可以工作。

总之,问题不在于扩展,而是在使用nodejs编译,使用您编译的节点(为了构建VS解决方案,我假设您已经这样做了)然后它应该在远程计算机上工作。

注意:问题依赖于您使用64位编译的node.exe运行32位dll,这就是为什么它抱怨,如果你使用32位的node.exe它应该工作。 (至少那解决了我的问题)

答案 1 :(得分:0)

与您的探测器无关:在尝试执行扩展名为“.node”的脚本时,我得到相同的错误(Error: %1 is not a valid Win32 application),例如node.exe example.node。其他扩展名(.js,.txt,根本没有扩展名)工作正常。

答案 2 :(得分:0)

只是遇到了同样的问题,即使我的节点和插件的架构完全相同,我也得到了类似的错误消息。事实证明,您无法重命名节点可执行文件。它必须是node.exe,我试图同时测试多个版本,所以我不得不将它们放在自己的文件夹中。之后一切正常。

答案 3 :(得分: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

答案 4 :(得分:0)

使用 Electron Forge webpack typescript 样板。这对我有用:

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']
};

Source

或者 - 这也对我有用 -,您可以使用 better-sqlite3,如建议的 here