节点外部函数接口中最基本的示例是通过从节点自己的进程加载来调用atoi
:
var ffi = require('ffi');
var current = ffi.Library(null, {
'atoi': [ 'int', [ 'string' ] ]
});
console.log(typeof current.atoi('1234')); // 1234
但是我收到了这个错误:
throw new Error('Dynamic Symbol Retrieval Error: ' + this.error())
^
Error: Dynamic Symbol Retrieval Error: Win32 error 127
at DynamicLibrary.get (D:\web\node_modules\ffi\lib\dynamic_library.js:112:11)
at D:\web\node_modules\ffi\lib\library.js:50:19
at Array.forEach (native)
at Object.Library (D:\web\node_modules\ffi\lib\library.js:47:28)
at Object.<anonymous> (D:\web\native\winapi.js:5:19)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
显然,由于我访问自己的进程,因此无法与32/64位不兼容相关。那究竟是什么错?
答案 0 :(得分:0)
ffi.library的第一个参数应该是您尝试加载的dll的名称,您遇到的错误与丢失的符号有关。
答案 1 :(得分:0)
Visual Studio使用cpp编译默认,尝试用“extern c”包装你的dll函数,例如:
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int add(int a, int b);
#ifdef __cplusplus
}
#endif
BTW,ffi的正确例子:
首先,安装ffi和node-gpy包 然后,在你的js代码中:
const ffi = require('ffi');
var libm = ffi.Library(__dirname + '/dll/add.dll', {
'add': ['int', ['int', 'int']]
});
console.log(libm.add(1,2));
答案 2 :(得分:0)
最近,我还遇到了使用node-ffi加载DLL的错误。我的解决方案是:1。引入的DLL是否支持当前的计算机系统,如64位或32位。之前我犯了这个错误,当我将DLL文件转换为64位时,问题就解决了!