zoukankan      html  css  js  c++  java
  • 用vs2013开发node.js的addon.

     

     

    1. 下载node.js的源代码。

      https://github.com/joyent/node

      如果用svn下载,后面加上/trunk,以免把用不着的branches也下载下来,浪费时间。

    2. 安装VS, express版本也可以。我安装的是vs2013 ultimate.
    3. 安装python 2.x

      http://www.python.org/download/

      注意不能是3.x, 因为node-gyp目前需要2.x. 我安装的是2.7

    4. 用命令行工具,Cdnode源代码目录,运行vcbuild.bat

      成功后,会生成Release或者Debug目录以及其他文件。我的生成是Release目录。我们需要的是这个路径下的node.lib 文件,以便在我们的c++项目中引用。

    5. 打开VS2013,创建一个c++空项目。我的项目起名为myaddon2.

    6. 添加一个main.hmain.cpp文件。这两个文件可以分别放在include src 文件夹中,以方便管理。

      main.cpp引用main.h文件。

      #include "main.h"

      由于main.h是放在include文件夹中,需要设置一下才可以。

    7. 设置头文件的引用路径。 需要添加node源代码路径的src, depsv8include, depsuvinclude.

    8. 添加lib所在路径。我们需要这个路径下的node.lib文件。

    9. Linker中填入node.lib.

    10. 打开网页:

      https://nodejs.org/api/addons.html#addons_wrapping_c_objects

       

      复制代码并更改,以下是具体文件的代码:

      Main.h 空。

      Main.cpp:

    #include "main.h"

    #include <node.h>

    #include "myobject.h"

     

    using namespace v8;

     

    void InitAll(Handle<Object> exports) {

        MyObject::Init(exports);

    }

     

    NODE_MODULE(myaddon2, InitAll)

    Myobject.h

    #ifndef MYOBJECT_H

    #define MYOBJECT_H

     

    #include <node.h>

    #include <node_object_wrap.h>

     

    class MyObject : public node::ObjectWrap {

    public:

        static void Init(v8::Handle<v8::Object> exports);

     

    private:

        explicit MyObject(double value = 0);

        ~MyObject();

     

        static void New(const v8::FunctionCallbackInfo<v8::Value>& args);

        static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args);

        static v8::Persistent<v8::Function> constructor;

        double value_;

    };

     

    #endif

     

    Myobject.cpp

    #include "myobject.h"

     

    using namespace v8;

     

    Persistent<Function> MyObject::constructor;

     

    MyObject::MyObject(double value) : value_(value) {

    }

     

    MyObject::~MyObject() {

    }

     

    void MyObject::Init(Handle<Object> exports) {

        Isolate* isolate = Isolate::GetCurrent();

     

        // Prepare constructor template

        Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);

        tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));

        tpl->InstanceTemplate()->SetInternalFieldCount(1);

     

        // Prototype

        NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);

     

        constructor.Reset(isolate, tpl->GetFunction());

        exports->Set(String::NewFromUtf8(isolate, "MyObject"),

            tpl->GetFunction());

    }

     

    void MyObject::New(const FunctionCallbackInfo<Value>& args) {

        Isolate* isolate = Isolate::GetCurrent();

        HandleScope scope(isolate);

     

        if (args.IsConstructCall()) {

            // Invoked as constructor: `new MyObject(...)`

            double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();

            MyObject* obj = new MyObject(value);

            obj->Wrap(args.This());

            args.GetReturnValue().Set(args.This());

        }

        else {

            // Invoked as plain function `MyObject(...)`, turn into construct call.

            const int argc = 1;

            Local<Value> argv[argc] = { args[0] };

            Local<Function> cons = Local<Function>::New(isolate, constructor);

            args.GetReturnValue().Set(cons->NewInstance(argc, argv));

        }

    }

     

    void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) {

        Isolate* isolate = Isolate::GetCurrent();

        HandleScope scope(isolate);

     

        MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder());

        obj->value_ += 1;

     

        args.GetReturnValue().Set(Number::New(isolate, obj->value_));

    }

     

     

    1. 调试。

      设置vsdebug命令和工作路径。

      调试开始后,会自动启动node命令行。

      可以执行以下的命令查看效果。

      如果在 VS 中打上断点,可以进行跟踪。

    2. 使用addon.

      将生成的myaddon2.node文件拷贝到node.js项目文件夹或者子文件夹下。

      var myaddon2 = require("./addons/myaddon2")

      , nodeJsAddOncdObj;

       

       

      app.post('/api/increase/:num', function (req, res){

          if( !myobj ) myobj = new myaddon2.MyObject(req.params.num);

          res.format({

              //HTML returns us back to the main page, or you can create a success page

               html: function(){

                   //only return json.

               },

               //JSON returns the item with the message that is has been deleted

              json: function(){

                   res.json({

                       success:true,

                       result : myobj.plusOne()

                   });

               }

           });

       

      });

       

       

  • 相关阅读:
    Jquery 跨域访问 Lightswitch OData Service
    BizTalk 2010/2013 EDI B2B项目实践(1)
    Moon转告给你一个比Log4net更好日志框架--TracerX Logger 及其对应的日志查看器
    转告大家关于依赖注入
    明月语言专家简介
    几个常见翻译引擎的不完全对比
    说说我在项目中为什么不用实体框架,如果说我在诋毁你所爱的EF,请进来.
    大话ASP.NET(第二篇,Angular结构篇--翻译)
    大话ASP.NET开发(第一章 html5+css3+解耦问题的探讨)
    Moon.Orm性能报告
  • 原文地址:https://www.cnblogs.com/time-is-life/p/4647643.html
Copyright © 2011-2022 走看看