我想从节点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)
答案 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
您的里程可能会有所不同