有没有办法将v8函数转换为Windows信号可以使用的普通函数?

问题描述 投票:1回答:1

有一种方法可以将'v8 :: Local'转换为'void(int)'。我有一个v8函数,正在尝试将其传递到Windows的signal中。

  v8::Local<v8::Function> function;
  function = v8::Local<v8::Function>::Cast(args[1]);
  (void)signal(SIGINT, function);

我不确定最佳方法。信号的定义是:

    _ACRTIMP _crt_signal_t __cdecl signal(_In_ int _Signal, _In_opt_ _crt_signal_t _Function);

但是似乎_In_opt_ _crt_signal_t等同于void(int)

编辑:我尝试做jmrk建议的事情。我知道如何使v8持久化,但是我对如何包装它感到困惑。我尝试使用下面的包装器,但是它不起作用。

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);


windows signals v8
1个回答
1
投票

这不会直接起作用。 signal需要C ++函数,而v8::Local<...>是内部引用V8堆对象的C ++数据对象;在这种情况下,后者是一个JavaScript函数对象,如果您知道如何调用它,那么它除了具有属性和原型等之外,还可以调用,这肯定与C ++函数的方式不同被称为。

所以最好的(唯一的?)方法可能是在C ++中定义一个包装函数。将v8::Function存储在v8::Persistent中,然后即可使用它。 (所有这些都假设您的总体目标是在流程收到某个信号时执行JavaScript函数?)

© www.soinside.com 2019 - 2024. All rights reserved.