[email protected]之新手上路

本文详细介绍在Windows环境下使用Node.js、vscode及node-gyp搭建Addon开发环境的过程。涵盖新版Node.js参数调整、Buffer与Number类型转换技巧,以及如何调用外部DLL,适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近要写一个addon插件,所以。。。。

   准备材料:1.安装python;2.安装开发包(下载 | Node.js 中文网);3.安装vscode(windows版本)/ xcode(MAC版本)

  我是在windows下开发,选择vscode。下面的经历都是windows版本,其他系统的忽略

  现在网上的材料大部分不适用于新版的node.js。举个例子:新版的参数多了一个v8::Local<v8::Context> context,很多转换都要用到。以前可以直接args[0]->ToString();现在是不允许了。

  安装好上述3件宝,将下载的hello范例拉到vscode上,选择nan版本,右键“在继承终端模式打开”,输入(1)>>>npm init

然后(2)>>>npm install nan

(3)>>>npm install node-gyp -g

(4)>>>node-gyp configure

(5)>>>node-gyp build  

之后的debug可以选择>>>node-gyp rebuild 取代(5),最后调试>>>node hello.js

上述的hello可以在C++ 插件 | Node.js API 文档看到详细的介绍,我不细说。

搭建好调试环境,接下来就是开动addon定制了。

我这个插件需要调用外部已经写好的DLL,所以要先SetDLLPath(用到windows API "SetDllDirectory"&"GetModuleHandle"&"LoadLibrary"等),网上一堆类似的教程,我不赘述了。js调用可能是

var buf=Buffer.alloc(2048);

buf.write(__dirname+'/dll_path')

addon.jSetDllPath(Object(buf), buf.length)

C++函数SetDLLPath:

void SetDLLPath_C(const Nan::FunctionCallbackInfo<v8::Value>& info)

{

Isolate* isolate = info.GetIsolate();

  v8::Local<v8::Context> context = isolate->GetCurrentContext();

Local<Object> out=Local<Object>::Cast(info[0]);    //直接Buffer类型就Object

  unsigned char *ss = (unsigned char *)node::Buffer::Data(out);

//处理传递的字符串

double arg1 = info[1]->NumberValue(context).FromJust();  //Buffer的大小

//...后面的省略

}

void Init(v8::Local<v8::Object> exports) {

  v8::Local<v8::Context> context = exports->CreationContext();

  exports->Set(context,

               Nan::New("SetDLLPath").ToLocalChecked(),

               Nan::New<v8::FunctionTemplate>(SetDLLPath_C)->GetFunction(context).ToLocalChecked());

}

NODE_MODULE(addon, Init)

这样就完成一个函数的对接。我只学Buffer和Number的传递,其他的String之类的完全摸不到边,工程时间急先这样做了。

上述的代码可以看出,js调用的实际上是暴露的接口字符串,和C的函数接口没啥关系,不过我们习惯写法都是将它们统一的(方便复制粘贴^_^)。同时也看出了新版的Buffer转换其实比旧版的要简单,但是Number转换时需要参数content,所谓的上下文。String也是和Number类似的,只不过缓存UTF8有点问题,我还在研究中。。。。

好了,暂时就这么多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值