?
?
- 下载node.js的源代码。
https://github.com/joyent/node
如果用svn下载,后面加上/trunk,以免把用不着的branches也下载下来,浪费时间。
- 安装VS, express版本也可以。我安装的是vs2013 ultimate.
- 安装python 2.x
http://www.python.org/download/
注意不能是3.x, 因为node-gyp目前需要2.x. 我安装的是2.7。
- 用命令行工具,Cd到node源代码目录,运行vcbuild.bat。
成功后,会生成Release或者Debug目录以及其他文件。我的生成是Release目录。我们需要的是这个路径下的node.lib 文件,以便在我们的c++项目中引用。
- 打开VS2013,创建一个c++空项目。我的项目起名为myaddon2.
- 添加一个main.h和main.cpp文件。这两个文件可以分别放在include和 src 文件夹中,以方便管理。
在main.cpp引用main.h文件。
#include
"main.h"由于main.h是放在include文件夹中,需要设置一下才可以。
- 设置头文件的引用路径。
需要添加node源代码路径的src, deps\v8\include, deps\uv\include. - 添加lib所在路径。我们需要这个路径下的node.lib文件。
- 在Linker中填入node.lib.
- 打开网页:
https://nodejs.org/api/addons.html#addons_wrapping_c_objects
?
复制代码并更改,以下是具体文件的代码:
Main.h 空。
Main.cpp:
#include "main.h" #include #include ? using ? void InitAll(Handle<Object> exports) { ????MyObject::Init(exports); } ? NODE_MODULE(myaddon2, InitAll) |
Myobject.h
#ifndef MYOBJECT_H #define ? #include #include ? class public: ????static ? private: ????explicit MyObject(double value = 0); ????~MyObject(); ? ????static ????static ????static v8::Persistent<v8::Function> constructor; ????double value_; }; ? #endif |
?
Myobject.cpp
#include "myobject.h" ? using ? Persistent<Function> MyObject::constructor; ? MyObject::MyObject(double } ? MyObject::~MyObject() { } ? void ????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 ????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 ????????obj->Wrap(args.This()); ????????args.GetReturnValue().Set(args.This()); ????} ????else { ????????// Invoked as plain function `MyObject(...)`, turn into construct call. ????????const ????????Local<Value> argv[argc] = { args[0] }; ????????Local<Function> cons = Local<Function>::New(isolate, constructor); ????????args.GetReturnValue().Set(cons->NewInstance(argc, argv)); ????} } ? void ????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_)); } |
?
?
- 调试。
设置vs的debug命令和工作路径。
调试开始后,会自动启动node命令行。
可以执行以下的命令查看效果。
如果在 VS 中打上断点,可以进行跟踪。
- 使用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()
???????????? });
???????? }
???? });
?
});
?
?