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. 用命令行工具,Cd到node源代码目录,运行vcbuild.bat。

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

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

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

    在main.cpp引用main.h文件。

    #include
    "main.h"

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

  7. 设置头文件的引用路径。
    需要添加node源代码路径的src, deps\v8\include, deps\uv\include.

  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. 调试。

    设置vs的debug命令和工作路径。

    调试开始后,会自动启动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()

                 });

             }

         });

     

    });

     

     

用vs2013开发node.js的addon.的更多相关文章

  1. 在开发node.js中,关于使用VS2013插件出现一直读取资源的问题

    情况描述: 1.安装了VS2013: 2.安装了VS开发node.js的插件; 3.打开以前的工程文件,有的可以打开,有的打不开.而且打不开的始终停留在读取资源的界面.很痛苦的.等半天都没有反应.到底 ...

  2. 【转】使用VS开发 Node.js指南

    参考:https://www.visualstudio.com/features/node-js-vs 这篇文章主要介绍了使用VS开发 Node.js的方法,主要是使用NTVS(Node.js Too ...

  3. VS2013创建Node.js C++ Addons的过程

    首先看我的Node.js版本. node –v v6.11.4 然后参照这篇文章来做: https://nodejs.org/api/addons.html#addons_hello_world 安装 ...

  4. VS轻松开发Node.js应用

    PTVS开发团队又开发出一款可以在VS里编写Node.js应用程序的插件--NTVS(Node.js Tools for Visual Studio),开发者可以在VS里轻松开发Node.js应用. ...

  5. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  6. 在Visual Studio上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  7. 在Visual Studio 2013 上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  8. 在Sublime Text3 开发Node.js遇到的一个小问题

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 以前的Sublime Text 2包管理出现问题了,不能安装新包,让人开发很捉急,今天装了个3,这个问题解决了 那我们就 ...

  9. KoaHub.js:使用ES6/7特性开发Node.js框架

    KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & ...

随机推荐

  1. JavaScript数据类型学习脑图:

  2. Android优化之软引用和弱引用

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用.这里重点介绍一下软引用和弱引用. 如果一 ...

  3. Three.js 类的粗略总结和实现

    类 1.Cameras 照相机,包括很多种类型的摄像机类,包括正交类型和投影类型的摄像机 2.Core 核心对象 3.Lights 光照,包括点光,环境光,镜面光等等 4.Loaders 专门用来加载 ...

  4. PYQT控件使用

    QtGui.QComboBox .addItem(string)#添加字符串项到Item.addItems(list)#添加列表或元组元素到Item.clear()#清除所有Item.clearEdi ...

  5. 4、Redis中对List类型的操作命令

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- ------------ ...

  6. python开发_tkinter_修改tkinter窗口的红色图标'Tk'

    学过java的swing可能知道,在创建一个窗口的时候,窗口的左上角是一个咖啡图标 如下图所示: 在python中,tkinter模块生成的窗口左上角是一个:Tk字样的图标(Tk为tkinter的缩写 ...

  7. spring mvc 如何传递集合参数(list,数组)

    spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...

  8. 2013Esri全球用户大会之ArcGIS for Server&Portal for ArcGIS

    Q1:ArcGIS 10.2 for Server有哪些新特性? ArcGIS 10.2对于ArcGIS for Server来说是一个引人注目的版本.它建立在ArcGIS 10.1扎实雄厚的基础上, ...

  9. 值得借鉴的Objective-C编程规范

    Daniel's Objective-C Coding Style Guidelines http://google-styleguide.googlecode.com/svn/trunk/objcg ...

  10. xcode4.3.2 arc模式下导入非arc的文件 转

    在arc模式下,我们经常会用到非arc的类库,此时我们可以在Compile Sources下对该文件进行编辑加入 -fno-objc-arc   如图中所示,就可以使用非arc的类库了   转:htt ...