javascript - 如何使用 ffi 将 WinApi 函数加载到 Node.js 中?

标签 javascript c++ node.js winapi

有一个图书馆叫ffi promise 允许用户加载系统 native 库并调用其中的函数。

使用他们的示例,我尝试使用 MessageBox位于 User32.dll 中的函数:

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:\MYSELF\programing\nodejs\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:\MYSELF\programing\nodejs\node_modules\ffi\lib\dynamic_library.js:112:11)
    at C:\MYSELF\programing\nodejs\node_modules\ffi\lib\library.js:50:19
    at Array.forEach (native)
    at Object.Library (C:\MYSELF\programing\nodejs\node_modules\ffi\lib\library.js:47:28)
    at Object.<anonymous> (C:\MYSELF\programing\nodejs\ffitest\winapi.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

关于javascript - 如何使用 ffi 将 WinApi 函数加载到 Node.js 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166949/

相关文章:

javascript - eric hynds 多选过滤器在销毁和重新绑定(bind)后不显示

javascript - 为什么我的具有多个路径的 express router.get URL 只呈现文本?

c++ - ';' 标记之前的预期主表达式

c++ - Visual Studio 的 CRT 中的 `_setmode` 如何与 `std::wcout` 交互?

javascript - 使用 Socket.io-node 仅向选定的用户发送数据

javascript - 当到达某个点时计算字符数

javascript - 为什么 Web 应用程序通过网络发送 HTML?

java - 使用 JNA 将多个 .dll 库注册到单个 java 类中

javascript - NodeJS 阻塞读取多个文件并返回快速响应

javascript - RethinkDB - 更新嵌套数组