我正在尝试从节点挂钩到 DLL,并且我已经了解了 ffi。与 MS 相比,我更喜欢 GNU/Linux。对我来说,常规 ffi 包无法正确构建,但 ffi-napi 却可以。我尝试遵循 npm 包站点 中挂钩到 ceil(double) 的简单测试例程。那里的示例代码链接了 libm 库,这对我来说更熟悉,但这不是 Microsoft 的做法。据我所知,这个函数位于msvcrt.dll中。我在节点应用程序 shell 中执行了以下操作:
ffi = require('ffi-napi')
msvcrt = ffi.Library('C:\\Windows\\System32\\msvcrt', {'ceil': [ 'double', [ 'double' ] ]})
在第二行按 Enter 后,有大量文本转储到节点 shell,然后应用程序关闭。有人在 Windows 上用过 ffi 吗?我有什么明显遗漏的东西吗?
我觉得有点傻,但我太精确了。它适用于:
ffi = require('ffi-napi')
msvcrt = ffi.Library('msvcrt', {'ceil': [ 'double', [ 'double' ] ]})
msvcrt.ceil(1.5)
向控制台写入“2”。我想我有点偏执,因为在 Linux 上搜索 /lib 和 /usr/lib 是自动的,但 Windows 很奇怪,给每个程序都有自己的目录。我猜 Windows 上的 ffi 默认会搜索 Windows\System32 目录。
这也让我担心,因为我不知道为什么完全合格的路径会导致它崩溃。如果有人对此有任何意见,我很想听听。
更新: 我通过使用以下方法让它使用完全限定的路径:
msvcrt = ffi.Library('\\Windows\\System32\\msvcrt', {'ceil': [ 'double', [ 'double' ] ]})
因此这允许在同一“驱动器号”上的任何位置访问 DLL(对于我现在的使用来说就足够了)。如果我找到穿越到不同驱动器的答案,我会再次更新。
为了在node.js中更好地使用ffi,您可以使用ffi-rs,它通过rust为node.js实现了ffi。https://github.com/zhangyuang/node-ffi-rs