从nodejs

时间:2016-09-04 17:01:18

标签: node.js dll node-ffi

我想从节点js加载一个dll文件。这是头文件:

#pragma once
#ifdef __cplusplus
#define EXAMPLE __declspec(dllexport) 

extern "C" {
    EXAMPLE int Add(int, int);
}
#endif

在编译中,我选择“编译为C代码”

在活动解决方案平台中,我选择x64

然后,我使用ffi模块加载它:

var ffi = require('ffi');

var Lib = ffi.Library('test', {'Add' : ['int',['int','int']]});

但我得到了一个错误:

C:\Users\TheHai\node_modules\ffi\lib\dynamic_library.js:112
    throw new Error('Dynamic Symbol Retrieval Error: ' + this.error())
    ^

Error: Dynamic Symbol Retrieval Error: Win32 error 127
    at DynamicLibrary.get (C:\Users\TheHai\node_modules\ffi\lib\dynamic_library.js:112:11)
    at C:\Users\TheHai\node_modules\ffi\lib\library.js:50:19
    at Array.forEach (native)
    at Object.Library (C:\Users\TheHai\node_modules\ffi\lib\library.js:47:28)
    at Object.<anonymous> (C:\Users\TheHai\Downloads\Compressed\nodejs-websocket-master\samples\chat\server.js:8:15)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)

3 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题。我不知道这个错误的确切原因。但是我更改了以下内容(只需将DLL名称从&#39; test&#39;更改为&#39; ./test' )并且它有效。你也尝试相同,让我知道它是否有效。谢谢

var ffi = require('ffi');

var Lib = ffi.Library('./test', {'Add' : ['int',['int','int']]});

答案 1 :(得分:0)

PSA:如果您声明FFI在DLL中找不到的函数,也会发生此错误。

从头文件生成功能列表并恢复为手写文件后,我遇到了相同的错误。

答案 2 :(得分:0)

以防万一有人落在这里...

在上面的示例中,ffi.Library具有(基本上)两个参数:第一个是(dll)文件的路径名;第二个是文件名。第二个定义了要引用的函数(函数名称:[return_type],[parameter_type],...)。

我不确定错误编号的100%,但是我“认为”如果出现错误126,则表明第一个参数有问题-找不到文件(要进行测试,请尝试使用全路径,并从那里调试)。

如果收到错误127(在此处报告),则表明第二个参数存在问题-在指定的dll中找不到列出的函数。

这通常表示dll的编译方式存在问题。在上面的示例中,它声明将其编译为“ C”(而不是C ++),这会由于#if __cplusplus而导致不包括导出。

我认为,如果该项目被编译为C ++,它将可以正常工作。

或者,这是一个对我有用的示例(在我的export.h文件中)。

#if defined(WIN32) || defined(_WIN32)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

#ifdef __cplusplus
extern "C" {
#endif

EXPORT int PWDownload_Start(int iHeartbeat);

#ifdef __cplusplus
}
#endif

您的里程可能会有所不同