我尝试将node-vlc与nw.js(v0.12.0-alpha2)一起使用.当我启动我的应用程序没有nw.js它工作,但当我用nw.js启动它时,我收到一个错误:
未捕获的错误:模块没有自行注册.",来源:/home/alexis/Bureau/dev/jukebox/node_modules/vlc/node_modules/ffi/node_modules/bindings/bindings.js(84)
我用nw-gyp尝试了一些命令,但它无法帮助我.我在Ubuntu 14,64位.
我有一些现有的C++代码,可以在独立的C++应用程序中进行数值处理.我现在想在新的node.js应用程序中使用该代码.
研究如何从node.js访问C++代码,有两个选项:
node-ffi似乎是访问现有库的一个很好的选择,但我是否正确地思考如果我使用node-ffi我将不得不编写一个C包装器来使我的C++可访问?(这是我可以通过Visual Studio在Windows上使用简单的测试用例的唯一方法).
对于我的情况,我的源代码已经在C++中,而不是C,在上面两个选项之间选择有哪些注意事项?
我正在尝试node-ffi库来调用cpp代码.
CPP代码
typedef struct{
char * key,
char * value
} ContextAttribute;
typedef struct{
ContextAttribute * attribute,
int count
} Context;
Run Code Online (Sandbox Code Playgroud)
这用于
Status Init(
Handle* handle,
const char* id,
const char* token,
const char* apiKey,
const char* productname,
const char* productVersion,
const char* productLanguage,
PlatformType platform,
const char* userGuid,
EventCb eventcb,
Context * context
);
Run Code Online (Sandbox Code Playgroud)
我通过以下node-ffi javascript代码使用上面的cpp 代码
var ref = require('ref');
var ffi = require('ffi');
var Struct = require('ref-struct');
var ContextAttribute = new Struct({
key: "string", …
Run Code Online (Sandbox Code Playgroud) 我正在开发的Windows简单节点的WebKit应用程序(Vista中,7,...),我需要使用一些WinAPI的功能,特别是,RegisterHotKey
和SendInput
,结合全系统热键,并基于该击键.node-webkit没有提供这样的API,所以我想使用node-ffi来调用这些函数.
我是WinAPI开发的新手,所以我读了一些MSDN手册,但发现大多数例子都创建了窗口,消息循环,消息处理程序等等.所以我不太了解,如何从node-webkit正确调用WinAPI,而不创建单独的窗口?
Node-ffi教程没有涵盖这种情况,所以我找到了节点Windows库,但它似乎只是通过节点实现Windows应用程序.
有没有办法在不创建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);
Run Code Online (Sandbox Code Playgroud)
这些命令的组合似乎与我尝试过的命令最为一致,但它并不是一直有效.如果我想要将焦点切换到的窗口最小化,它将始终弹出到顶部.如果窗口没有最小化,但只是在另一个窗口后面,它将只是间歇性地显示.我不确定如何始终如一地使正在运行的Windows应用程序始终移动到订单的顶部,即使它当前已最小化.
我想在Javascript中解析C头文件.有没有这样的图书馆?否则,任何提示可以帮助我开始?
更新:我的最终目标是自动构建node-ffi的接口.解析器不一定必须在Javascript中,只要它可以吐出Javascript可理解的格式.如果我自己很难开发,我可能不得不采用现成的解决方案......?
我正在尝试将外部C++库(我可以访问.so文件以及头文件)集成到我的Node.js应用程序中.
经过大量研究后,我的选择减少到:
从node-ffi的gitHub的定义我无法判断它是否会直接在C++库上运行:
node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库.它可用于创建与本机库的绑定,而无需编写任何C++代码.
所以我的问题是:
I'm no expert when it comes to C/C++ so if I missed something basic for you to be able to answer please let me know so I can improve my question.
我正在使用node-ffi来调用一个函数,该函数将out-param作为指针到指针结构的指针.有没有办法使用ref-struct和ref-array来访问我得到的数组?
struct = require("ref-struct");
var rect_type = struct({
'x': 'int',
'y': 'int',
'width': 'int',
'height': 'int',
});
var rotation_type = struct({
'yaw': 'short',
'pitch': 'short',
'roll': 'short'
});
var face_type = struct({
'rect' : rect_type,
'rotation' : rotation_type,
'confidence' : 'double'
});
Run Code Online (Sandbox Code Playgroud)
我能够在函数调用之后从指针中获取第一个结构,但是我无法获得数组的其余部分:
var mylib = ffi.Library('lib/libN', {
'GetFaces' : [ 'int', [ 'pointer' ] ]
});
var pface_type = ref.refType(face_type);
var ppface = ref.alloc(pface_type);
result = mylib.GetFaces(ppface);
face = ppface.deref().deref();
console.log("X:" + face.rect.x + " Y:" + face.rect.y);
Run Code Online (Sandbox Code Playgroud)
有没有办法将参数声明为结构数组?我试过这个,但它不起作用: …
假设我有一个C函数,它接受一个回调并在另一个线程上调用它:
void call_in_new_thread(void (*callback)()) {
// spawn a new thread and call `callback` in it ...
}
Run Code Online (Sandbox Code Playgroud)
现在我想通过Node-FFI从javascript调用这个函数,传递一个javascript函数:
var callbackType = 'pointer'
var lib = ffi.Library('mylib', {
'call_in_new_thread': [ 'void', [ callbackType ] ],
})
var callback = ffi.Callback('void', [ 'void' ], function() {
// which thread I'm in now?
console.log("hello!")
})
lib.call_in_new_thread(callback)
Run Code Online (Sandbox Code Playgroud)
我的问题:它有效吗?它是线程安全的吗?javascript回调实际执行哪个线程?在node.js主线程中,还是在ffi库创建的线程中?Node-FFI会以某种方式同步呼叫吗?
我想从节点 js 加载一个 dll 文件。这是头文件:
#pragma once
#ifdef __cplusplus
#define EXAMPLE __declspec(dllexport)
extern "C" {
EXAMPLE int Add(int, int);
}
#endif
Run Code Online (Sandbox Code Playgroud)
在编译为,我选择“编译为 C 代码”
在主动解决方案平台中,我选择 x64
然后,我使用 ffi 模块加载它:
var ffi = require('ffi');
var Lib = ffi.Library('test', {'Add' : ['int',['int','int']]});
Run Code Online (Sandbox Code Playgroud)
但我得到了一个错误:
C:\Users\TheHai\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:\Users\TheHai\node_modules\ffi\lib\dynamic_library.js:112:11)
at C:\Users\TheHai\node_modules\ffi\lib\library.js:50:19
at Array.forEach (native)
at Object.Library (C:\Users\TheHai\node_modules\ffi\lib\library.js:47:28)
at Object.<anonymous> (C:\Users\TheHai\Downloads\Compressed\nodejs-websocket-master\samples\chat\server.js:8:15)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10) …
Run Code Online (Sandbox Code Playgroud)