首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法将v8函数转换为windows信号可用的普通函数?

有没有办法将v8函数转换为windows信号可用的普通函数?
EN

Stack Overflow用户
提问于 2020-01-30 03:30:25
回答 1查看 42关注 0票数 1

有没有办法从'v8::Local‘转换成'void (int)’?我有一个v8函数,我正试着把它传递给windows上的signal

代码语言:javascript
运行
复制
  v8::Local<v8::Function> function;
  function = v8::Local<v8::Function>::Cast(args[1]);
  (void)signal(SIGINT, function);

我不确定做这件事的最好方法。信号的定义是:

代码语言:javascript
运行
复制
    _ACRTIMP _crt_signal_t __cdecl signal(_In_ int _Signal, _In_opt_ _crt_signal_t _Function);

但是看起来_In_opt_ _crt_signal_t等同于_crt_signal_t(整型)

编辑:我试着按照jmrk的建议去做。我知道如何使其v8持久化,但我对如何包装它感到困惑。我试过使用下面的包装器,但它不起作用。

代码语言:javascript
运行
复制
struct c_api_interface { void (*func_js)(v8::Persistent<v8::Function>);};

  template<typename Fn, Fn fn, typename... Args>
  typename std::result_of<Fn(Args...)>::type
    wrapper(Args... args) {
    return fn(std::forward<Args>(args)...);
  }
#define WRAPIT(FUNC) wrapper<decltype(&FUNC), &FUNC>



  v8::Local<v8::Function> function;
  function = v8::Local<v8::Function>::Cast(args[1]);
  v8::Persistent<v8::Function> value(isolate, function );
  c_api_interface my_interface;
  my_interface.func_js = WRAPIT(value);

  (void)signal(SIGINT, my_interface.func_js);
EN

回答 1

Stack Overflow用户

发布于 2020-01-30 03:51:43

这不会直接起作用。signal需要一个C++函数,而v8::Local<...>是一个在内部引用V8堆对象的C++数据对象;在本例中,后者是一个JavaScript函数对象,除了具有属性和原型等,如果您知道如何调用它,它也是可调用的,这肯定不同于C++函数的调用方式。

所以最好的(只有?)解决这个问题的方法可能是在C++中定义一个包装器函数。将v8::Function存储在v8::Persistent中,然后就可以访问它了。(所有这些都假设您的总体目标是在进程接收到特定信号时执行JavaScript函数?)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59974288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档