Articles of node ffi

SDL2 – RenderPresent随机抽取20-30 + ms(在Node.JS FFI调用中)

我一直在更新Node.JS FFI到SDL来使用SDL2。 ( https://github.com/Freezerburn/node-sdl/tree/sdl2 )到目前为止,这一切进展顺利,我可以成功渲染1600多种彩色纹理,而不会有太多问题。 然而,我刚开始遇到一个我似乎无法弄清楚的问题,似乎与FFI,GC,Javascript的速度等没有任何关系。 问题是,当我打电话给SDL_RenderPresent VSYNC启用,偶尔,每隔几秒,这个电话将需要20-30或更多的毫秒来完成。 看起来这是连续发生的2-3次。 无论在屏幕上移动什么,这都会引起一个非常简短但明显的视觉障碍。 剩下的时间,这个调用将花费正常的时间来显示什么在正确的时间被画到屏幕上,以便与屏幕同步,并且一切看起来都很平滑。 如果你克隆上面提到的仓库,你可以看到这一点。 用node-gyp构build它,然后运行test.js. (我可以将testing代码embedded到StackOverflow中,但是我认为只需在GitHub上提供完整的示例会更容易)需要SDL2,SDL2_ttf和SDL2_image位于/ Library / Frameworks中。 (这还在开发中,所以没有什么特别的东西可以自动查找SDL2,或者在存储库中具有所需的代码,或从某个地方取出等) 编辑:这应该可能会根据gamedev StackExchange网站。 不知道是否可以移动/链接或不。

库在节点ffi中处理

我正在把gssapi集成到node.js中 我不知道如何表示这一点: gss_init_sec_context函数包含许多基于结构的参数,其中一些嵌套很深。 比如这个结构体: typedef struct gss_ctx_id_struct { gss_OID mech; #ifdef USE_KERBEROS5 struct _gss_krb5_ctx_struct *krb5; #endif } gss_ctx_id_desc; 所以基于这个我猜我需要实现某种结构(与ref-struct)来表示krb5指针(因为正在使用kerberos5)。 所以我看着这个_gss_krb_ctx_struct ,看到了这个… typedef struct _gss_krb5_ctx_struct { Shishi *sh; Shishi_ap *ap; Shishi_tkt *tkt; Shishi_key *key; gss_name_t peerptr; int acceptor; uint32_t acceptseqnr; uint32_t initseqnr; OM_uint32 flags; int reqdone; int repdone; } _gss_krb5_ctx_desc, *_gss_krb5_ctx_t; Shishi是一个指向库的指针,而shishi_ap似乎是一个指向函数的指针。 我不知道如何在node-ffi中实现这些东西。 有人能给我一些指导吗?

NodeJS / node-ffi:内存泄漏/variables范围

我正在调查我的nodejs脚本中的内存泄漏。 请考虑下面的代码块(整个源代码将在底部)。 GetImage调用一个C函数来分配一个缓冲区,并且调用者有责任释放它。 在res.send(data)行后, var dataPtr会在GC期间被释放? app.get('/test', function(req, res) { res.contentType('image/jpeg'); var lengthPtr = ref.alloc('uint'); var dataPtr = ref.alloc('uchar*'); lib.GetImage(dataPtr, lengthPtr); var length = lengthPtr.deref(); var data = ref.reinterpret(ref.deref(dataPtr), length); res.send(data); }); 处理大约20000个请求后出现错误消息: Error: reinterpret: Cannot reinterpret from NULL pointer at Object.reinterpret (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/ref/lib/ref.js:773:21) at Object.handle (/home/ltse/LinuxPort/Experiments/NodeAddon/ffi.js:20:17) at next_layer (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/route.js:107:5) at /home/ltse/LinuxPort/Experiments/NodeAddon/node_modules/express/lib/router/index.js:213:24 at […]

我如何处理Node.js中的SlowBuffer?

现在我正在用Node.js开发一个usb-serial应用程序。 这个DLL返回INVALID_HANDLE_VALUE,如果无法打开COM端口。 所以我想在Node.js中处理ret值。 在这种情况下,我如何处理? 我不知道如何比较ret值和SlowBuffer。 DLL #define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1 typedef HANDLE (*OPEN)(int); __declspec(dllexport) HANDLE opencom(int ncom) node.js与node-ffi var ffi = require('ffi'); var lib = ffi.Library('serialmw.dll', { 'opencom' : ['pointer', ['int']] }); var hcom = null; hcom = lib.opencom(1); console.log(hcom); // <SlowBuffer@0xFFFFFFFFFFFFFFFF >

如何使用节点ffi调用C ++代码

我正在写一个数据采集应用程序,但是我没有一个传统的无聊的前端,我已经负责把Web 2.0的前端,我听说Node.js擅长调用C ++代码,但是因为我得到我应该考虑把我的DLL链接到我的前端的阶段,我碰到了一堵砖墙。 我知道我可以在本地编写代码而不使用诸如node-ffi之类的附加内容,但坦率地说,使用Google的V8语法执行这些绑定的语法看起来相当复杂,因此我猜ffi是最简单的方法处理这个(事情。 我知道之前有一个预先的问题,并且在这里有一个答案,但是我仍然对如何编写填充程序以允许我从节点调用C ++ dll有点不安。 我有以下C ++头文件: #include "NIDAQmx.h" #include <string> using std::string; namespace DAQReaderDll { class DAQReader { private: int32 m_read; int32 m_error; TaskHandle m_handle; bool m_isRunning; char m_errBuff[2048]; public: __declspec(dllexport) DAQReader(); __declspec(dllexport) ~DAQReader(); __declspec(dllexport) void startDevice(); __declspec(dllexport) void stopDevice(); __declspec(dllexport) float32 getSample(); __declspec(dllexport) bool isRunning(); __declspec(dllexport) string getError(); }; // Used […]

节点ffi Recttypes

我想要使​​用node-ffi和user32库在节点中获取特定窗口的大小。 无法使Rect指针工作,我得到NULL作为输出或致命的错误。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms633503(v=vs.85).aspx 出 LPRECT lpRect应该包含左上angular和右下angular的坐标。 var ffi = require('ffi'); var ref = require('ref'); var Struct = require('ref-struct'); var lpctstr = { name: 'lpctstr', indirection: 1, size: ref.sizeof.pointer, get: function(buffer, offset) { var _buf = buffer.readPointer(offset); if(_buf.isNull()) { return null; } return _buf.readCString(0); }, set: function(buffer, offset, value) { var _buf = ref.allocCString(value, 'ucs2'); return […]

我怎样才能在nodejs窗口截图?

我在研究中find一种方法来使用nodejs来截取窗口的截图,我正在尝试使用node-ffi来做到这一点,但我不知道如何…在这里,我被困在这里: var ffi = require('ffi'); var user32 = new ffi.Library("user32", { FindWindowA: [ 'uint32' , [ 'string', 'string' ]] , PrintWindow: [ 'int32' , [ 'int32', 'string', 'int32' ]] }); var IMG; var windowHandle = user32.FindWindowA(null, "Calculator"); var printWin = user32.PrintWindow(windowHandle, IMG, 0); console.log(printWin); console.log(IMG); 结果: $ node get-print.js 1 undefined EDITED 我在C ++中find了以下工作代码 Bitmap […]

node-ffi:dynamic链接错误

我有一个C ++方法(哪个angular色正在杀死一些进程),在一个库Risk.dll中。 另一方面,我正在开发一个在Google Chrome上运行的networking应用程序(使用Nodejs和AngularJS)。 当我通过浏览器单击button时,我希望能够通过我的app.js文件调用C ++函数。 我决定使用Node-ffi,但是我有错误: Error: Dynamic Linking Error: "Risk.dll": 这是我在javascript上的代码: var ffi = require('ffi') //Kill Server socket.on('killserver', function(date){ var cTest = ffi.Library("Risk", { "DateModified":["long", ["string"] ] }); var res = cTest.DateModified(date); console.log(res) }); 在C ++中,我已经完成了 extern C{ } 而我想补充一点,我的文件Risk.dll与文件server.js在同一个文件中,当我想要使用我的应用程序时,我使用Node运行。 任何线索?

将焦点从Node-JS设置到Windows应用程序

我有一个在Windows上运行的NodeJS应用程序,当用户执行特定操作时,需要显示并将焦点切换到正在运行的Windows应用程序。 我一直在使用node-ffi包进行windows API调用,但一直无法使焦点切换。 这是我正在使用的代码。 它成功地得到了正在运行的Calculator应用程序的HWND,但是随后尝试将焦点切换到该HWND,并且它仅在有时才起作用: var ffi = require('ffi'); var intPtr = ref.refType('long'); var user32 = new ffi.Library('user32', { 'FindWindowA': ['long', [ 'string', 'string']], 'SetForegroundWindow': ['bool', ['long']], 'BringWindowToTop': ['bool', ['long']], }); var winToSetOnTop = user32.FindWindowA(null,"calculator") var res = user32.ShowWindow(winToSetOnTop, 9); res = user32.SetForegroundWindow(winToSetOnTop); res = user32.BringWindowToTop(winToSetOnTop); 这些命令的组合似乎与我所尝试过的最一致,但并不一直工作。 如果我想要将焦点切换到最小的窗口,它将始终popup到顶部。 如果窗口不是最小化的,而是在另一个窗口的后面,它将只会间歇显示。 我不知道如何始终如一地让运行的Windows应用程序始终移动到订单的顶部,即使它当前已经最小化了。

使用节点js的pAnisChar调用Delphi stdcall函数

我有一个传统的Delphi DLL需要一个JSONstring作为input(pAnsiChar),并返回一个int作为成功或失败。 我设法使用node-ffi从nodejs连接到dll。 但是,我正在返回int值的值无效的jsonstring。 有人能指出我如何调用一个delphiDLL与pAnsiChar作为节点的函数参数 谢谢