首页 > 解决方案 > 有没有办法将 v8 函数转换为 Windows 信号可用的正常函数?

问题描述

有没有办法从 'v8::Local' 转换为 'void (int)'。我有一个 v8 函数,我试图将它传递给 windows 上的信号

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


标签: windowssignalsv8

解决方案


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

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


推荐阅读