Windows环境NodeJS使用ffi-napi调用msvcrt.dll函数崩溃问题求助
问题原因与解决方案
- 首先排查架构匹配问题
崩溃大概率是Node.js运行时架构和目标dll架构不匹配导致的:- 64位Node只能调用System32目录下的64位msvcrt.dll
- 32位Node需要调用SysWOW64目录下的32位msvcrt.dll,主动指定对应路径可以避免系统自动重定向带来的异常
- 其次修正函数调用约定配置
Windows平台的msvcrt导出的C标准库函数默认使用cdecl调用约定,ffi-napi默认使用stdcall约定,约定不匹配会触发栈内存异常直接导致进程退出,定义导出函数时需要显式指定调用约定。
正确的测试代码如下:
const ffi = require('ffi-napi'); // 按你当前Node架构选对应路径,64位用System32,32位用SysWOW64 const msvcrt = ffi.Library('C:\\Windows\\System32\\msvcrt', { 'ceil': [ 'double', [ 'double' ], { abi: ffi.FFI_CDECL } ] }); // 测试调用 console.log(msvcrt.ceil(2.3)); // 预期输出3
- 额外注意事项
如果是调用第三方自定义的dll,还需要提前确认dll的依赖链完整,可以用Dependency Walker工具提前检查dll是否缺少依赖运行库,避免加载时触发未捕获异常。
内容的提问来源于stack exchange,提问作者Poisson Aerohead
相关产品推荐
相关产品推荐

