如何使用ffi将WinApi函数加载到Node.js中
How to load WinApi functions into Node.js using ffi?
有一个名为ffi
的库,它承诺允许用户加载系统本机库并调用其中的函数。
使用他们的例子,我尝试使用位于User32.dll:中的MessageBox函数
var ref = require('ref');
var ffi = require('ffi');
var Struct = require('ref-struct');
// Define Winapi types according to
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx
var winapi = {};
winapi.void = ref.types.void;
winapi.PVOID = ref.refType(winapi.void);
winapi.HANDLE = winapi.PVOID;
winapi.HWND = winapi.HANDLE;
winapi.WCHAR = ref.types.char;
winapi.LPCWSTR = ref.types.CString;
winapi.UINT = ref.types.uint;
// Try to load message box function as defined in
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505%28v=vs.85%29.aspx
var current = ffi.Library("user32.dll", {
'MessageBox': [ 'int', [ winapi.HWND, winapi.LPCWSTR, winapi.LPCWSTR, winapi.UINT ] ]
});
current.MessageBox(0, "sss", "sss", 0);
此操作失败,出现错误:
C:MYSELFprogramingnodejsnode_modulesffilibdynamic_library.js:112
throw new Error('Dynamic Symbol Retrieval Error: ' + this.error())
^
Error: Dynamic Symbol Retrieval Error: Win32 error 127
at DynamicLibrary.get (C:MYSELFprogramingnodejsnode_modulesffilibdynamic_library.js:112:11)
at C:MYSELFprogramingnodejsnode_modulesffiliblibrary.js:50:19
at Array.forEach (native)
at Object.Library (C:MYSELFprogramingnodejsnode_modulesffiliblibrary.js:47:28)
at Object.<anonymous> (C:MYSELFprogramingnodejsffitestwinapi.js:23:19)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Function.Module.runMain (module.js:501:10)
我试图把声明改成一些无稽之谈,但我得到了同样的错误,所以我想这真的是错误的。如何修复它以使其正常工作?我是否指定了不正确的数据类型?
请尝试此操作。
var current = ffi.Library("User32.dll", {
'MessageBoxA': [ 'int', [ winapi.HWND, winapi.LPCWSTR, winapi.LPCWSTR, winapi.UINT ] ]}
);
current.MessageBoxA(ref.NULL, "sss", "sss", 0);
从技术上讲,这些是LPCSTR字符串,而不是LPCWSTR,因为我们使用的是Ansi,而不是UTF-16
相关文章:
- 在 ubuntu 上安装 node js pulsar 客户端
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 在 node.js 中将缓冲区从 C++ 转换为 UTF-8 字符串
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- 如何使用 v8 本机插件将 C++ 数组交付到 Node.js
- C++ 和 node.js 之间的 RSA 加密
- node.js Nan:在函数C++调用 JavaScript 回调
- 迭代 Napi::对象属性(键)在 Node.js C++ N-API 中
- 上传大文件并解析时使用 Node.js v10.15.1 时出现致命错误
- 如何在 Node.js 中解压缩 c# 打包结构
- 使用 Node.js 调用child_process与从 C 调用子进程并创建C++绑定以从 node.js 调用
- 我们如何访问 Node.js 应用程序之外的内存?
- 我正在c 中的buidling node.js绑定
- 以有效的方式从 Node .js运行 C 或C++代码
- node.js:如何从C 模块中产生
- 如何编译 node.js for CentOS 6.10 (库问题)
- 如何使用 Node.js 开发一个侦听器来接收许多车辆跟踪数据(通过 TCP)
- 使用 N-API 将数据流式传输到 Node.js C++ 插件中
- 在node.js addon中阻止呼叫
- Node.js与C++的集成