我今天遇到了一个令人沮丧的问题。我正在node-ffi
我的电子应用程序中运行 C++ 代码。总的来说,我有很好的经验,但我今天开始使用多线程并遇到了一些困难。我传入的回调ffi
是从线程调用的。然而,当我结束循环并尝试将join
循环线程连接到主线程时,它完全冻结了电子应用程序。
完整免责声明:我对 C++ 还很陌生,并且希望对我的代码提供任何反馈以改进它,特别是您认为我应该注意的任何危险信号。
以下两个存储库演示了我遇到的错误:
Electron Project - https://github.com/JakeDluhy/threading-test
C++ DLL - https://github.com/JakeDluhy/ThreadedDll
以下是我正在做的事情的概述:
在我的 dll 中,我公开了开始/结束会话和开始/停止流式传输的函数。它们调用类实例的引用来实际实现功能。本质上,它是更强大的 C++ 类的 C 包装器。
// ThreadedDll.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#ifdef THREADEDDLL_EXPORTS
#define THREADEDDLL_API __declspec(dllexport)
#else
#define THREADEDDLL_API __declspec(dllimport)
#endif
THREADEDDLL_API void beginSession(void(*frameReadyCB)());
THREADEDDLL_API void endSession();
THREADEDDLL_API void startStreaming();
THREADEDDLL_API void stopStreaming();
#ifdef __cplusplus
}
#endif
// ThreadedDll.cpp
#include "ThreadedDll.h"
#include "Threader.h"
static Threader *threader = NULL;
void beginSession(void(*frameReadyCB)())
{
threader …
Run Code Online (Sandbox Code Playgroud) 我的Nodejs应用程序在ubuntu中运行正常.当我尝试在Windows机器中部署相同时,它显示以下错误.
=>node server.js
D:\home\site\wwwroot
D:\home\site\wwwroot\node_modules\ffi\node_modules\bindings\bindings.js:83
throw e ^
Error: %1 is not a valid Win32 application.
D:\home\site\wwwroot\node_modules\ffi\node_modules\ref\build\Release\binding.node
at Error (native)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at bindings
Run Code Online (Sandbox Code Playgroud)
我删除了ffi模块,并在Windows机器上再次尝试npm install ffi它也没有工作.
=> npm install ffi
D:\home\site\wwwroot
npm WARN package.json @ No description
npm WARN package.json @ No repository field.
npm WARN package.json @ No README data
npm WARN package.json @ No license field.
gyp ERR! build error
gyp ERR! stack Error: `msbuild` failed with …
Run Code Online (Sandbox Code Playgroud) 我想生成 6 个随机数,将它们推送到一个向量上,然后使用rustc_serialize
该向量将该向量编码为 NodeJS使用的 JSON 字符串。
extern crate rand;
extern crate rustc_serialize;
use rand::{OsRng, Rng};
use rustc_serialize::json::{self, Json, ToJson};
#[no_mangle]
pub extern "C" fn generate() -> String {
let choices: [u8; 6] = [1, 2, 3, 4, 5, 6];
let mut rand_vec: Vec<u8> = Vec::new();
let mut rng = match OsRng::new() {
Ok(t) => t,
Err(e) => panic!("Failed to create OsRng!, {}", e),
};
for _ in 0..5 {
rand_vec.push(*rng.choose(&choices).unwrap());
}
json::encode(&rand_vec).unwrap()
}
Run Code Online (Sandbox Code Playgroud)
这段代码被编译为一个库generate_6_rand.dll
。我有一个单独的二进制文件,用于测试此代码。
如果我跑
println!("{:?}", …
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何在 C 库和 NodeJS 模块之间传递数据。我可以通过 NodeFFI 模块执行此操作吗?
或者我是否必须编写自己的 NodeJS 插件来开发 C-NodeJS 接口?
我想在 nodejs 中使用 Windows Api 中的 SendInput 函数,使用 FFI 包。
我对 C 的了解有限,所以我无法真正弄清楚我有什么问题,我基本上是在尝试虚拟按下键盘上的一个键。
这是我的代码:
var ffi = require('ffi');
var ref = require ('ref');
var struct = require ('ref-struct');
var keyboardInput = struct({
'type': 'int',
'wVK': 'int',
'wScan': 'int',
'dwFlags': 'int',
'time': 'int',
'dwExtraInfo': 'int64'
});
var keyboardInputPtr = ref.refType(keyboardInput);
var keyboard = new keyboardInput();
keyboard.type = 1;
keyboard.wVK = 0x41;
keyboard.wScan = 0;
keyboard.dwFlags = 2;
keyboard.time = 0;
keyboard.dwExtraInfo = 0;
var user32 = ffi.Library('user32', {
'SendInput': [ 'int', …
Run Code Online (Sandbox Code Playgroud)