原生 c++ Node.js 的扩展:“克隆”本地<值>在构造函数中

发布于 2024-12-03 03:21:28 字数 1662 浏览 0 评论 0原文

我读过教程“编写 Node.js 本机扩展”: https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions

代码工作正常( https://github.com/pquerna/node-extension-examples /blob/master/helloworld/helloworld.cc

现在我想更改:更改

class HelloWorld: ObjectWrap
{
private:
  int m_count;
public:
(...)
 HelloWorld() :
    m_count(0)
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    hw->m_count++;
    Local<String> result = String::New("Hello World");
    return scope.Close(result);
  }
(...)
}

为类似的内容(在构造函数中复制参数并在 'Hello()' 中返回它):

class HelloWorld: ObjectWrap
{
private:
  Local< Value > myval;/* <===================== */
public:
(...)
 HelloWorld(const Local< Value >& v) :
   myval(v) /* <===================== */
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);/* <===================== */
  }
(...)
}

我的代码似乎没有工作, hello() 似乎返回一个整数

var h=require("helloworld");
var H=new h.HelloWorld("test");
console.log(H.hello());

在构造函数中复制 myval 并在函数 'Hello()' 中返回 myval 的正确方法是什么?我应该在析构函数中管理一些东西吗?

谢谢。

皮埃尔

I've read the tutorial "Writing Node.js Native Extensions": https://www.cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions

The code worked fine ( https://github.com/pquerna/node-extension-examples/blob/master/helloworld/helloworld.cc )

Now I want to change:

class HelloWorld: ObjectWrap
{
private:
  int m_count;
public:
(...)
 HelloWorld() :
    m_count(0)
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    hw->m_count++;
    Local<String> result = String::New("Hello World");
    return scope.Close(result);
  }
(...)
}

to something like that ( copy a parameter in the constructor and return it in 'Hello()' ):

class HelloWorld: ObjectWrap
{
private:
  Local< Value > myval;/* <===================== */
public:
(...)
 HelloWorld(const Local< Value >& v) :
   myval(v) /* <===================== */
  {
  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);/* <===================== */
  }
(...)
}

my code doesn't seem to work, hello() seems to return an integer

var h=require("helloworld");
var H=new h.HelloWorld("test");
console.log(H.hello());

What's the right way to copy myval in the constructor and return myval in the function 'Hello()' ? And should I manage something in the destructor ?

Thanks.

Pierre

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我们的影子 2024-12-10 03:21:29

“本地”变量将被自动清除,因此您不能像这样保存它们的副本。您需要使用“持久”句柄。

class HelloWorld: ObjectWrap
{
private:
  Persistent< Value > myval;
public:
(...)
  HelloWorld(const Local< Value >& v) : 
    myval(Persistent< Value >::New(v)) {

  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);
  }
(...)
}

'Local' variables will be automatically cleaned up, so you can't just save a copy of them like that. You need to use a 'Persistent' Handle.

class HelloWorld: ObjectWrap
{
private:
  Persistent< Value > myval;
public:
(...)
  HelloWorld(const Local< Value >& v) : 
    myval(Persistent< Value >::New(v)) {

  }
(...)
 static Handle<Value> Hello(const Arguments& args)
  {
    HandleScope scope;
    HelloWorld* hw = ObjectWrap::Unwrap<HelloWorld>(args.This());
    return scope.Close(hw->myval);
  }
(...)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文