很多人比较关注Google的JS V8 JavaScript引擎,确实Google最近很高调。但这个库在Windows下使用确实有点难度,即使在Linux嵌入,也需要下载gyp,编译安装,然后再下载v8,再编译,再嵌入,再就是……搞这些,你得跳墙,可谓学习成本与应用成本都比较高。

我不迷恋Google,喜欢一些Google的项目,比如angelproject,protobuf。

下一篇文章讨论V8与JSRT的性能

下面我来讲讲Windows Desktop环境嵌入JS脚本支持。在Windows环境,这真是一个宝贝,如果不考虑可移植性,绝对可以很好的替代Lua,因为它比Lua更高效,更易用,支持的开发环境也多。这是一篇中级文章,不详细介绍到参数如何使用,自己领悟。

微软为C++提供了非常方便的JS脚本接口(JavaScript Runtime Hosting, JSRT),以至于我了解了这个接口后,认为Lua的基于堆栈式接口实在是非常难用。微软为JSRT提供了完整的接口文档,但说明不够详尽,也提供了一个风格不太优雅的例子项目,还为C#进行了封装。微软也为JSRT提供了调试接口,但本人未使用,所以希望以后的文章有机会再进行讲解。

使用JSRT,需要两样东西,include <jsrt.h> 连接jsrt.lib,嗯,就是这么简单的前提。也希望你不要认为后面就很麻烦。

三行代码即可构建完整的JS运行环境。

JSRT的接口均使用Js前缀,并且返回统一的错误代码,正确运行返回JsNoError。

JS是基于对象的语言,所有函数应该都属于一个对象,我们注册到JS环境的函数/变量自然也属于一个对象——全局对象。

JSRT里的一起对象用C++操作时都是JsRef,可以用JsGetValueType获取类型。类型有JsString,JsFunction,JsNumber,JsError等。

JSRT当产生异常/错误时,可用JsGetAndClearException来获取并清理,取到的应该是JsError类型。

代码:

#include <jsrt.h>//别忘了link jsrt.lib

int main()

{

auto r = JsCreateRuntime(JsRuntimeAttributeNone, JsRuntimeVersion11, 0, &runtime);// 创建环境

r = JsCreateContext(runtime, 0, &context);// 创建上下文描述或者叫描述表

r = JsSetCurrentContext(context);// 把上面创建的设置为当前的

// 到这里,环境已经创建完成,可以执行脚本了

JsRef result;

r = JsRunScript(L"var value = 0;", 0, L"", &result);

}

函数支持

JsValueRef CALLBACK jsservice::log(JsValueRef callee, bool isConstructCall,
 JsValueRef *arguments, unsigned short argumentCount, void *callbackState)

{

// arguments 参数列表,第一个为调用者

// argumentCount 参数数量

return JS_INVALID_REFERENCE;//如果没结果

}

// 将函数注册到JS环境中

// 注册函数需要一个全局对象作为参数,可以调用JsGetGlobalObject取到

bool reg_func(const wchar_t* name, JsNativeFunction function_pointer)
{
 JsPropertyIdRef property_id;
 auto ec = JsGetPropertyIdFromName(name, &property_id);
 if (ec != JsErrorCode::JsNoError)
  return false;
 JsValueRef function;
 ec = JsCreateFunction(function_pointer, 0, &function);
 if (ec != JsErrorCode::JsNoError)
 {
  JsRelease(propertyId, 0);
  return false;
 }
 ec = JsSetProperty(global_object, property_id, function, true);
 if (ec != JsErrorCode::JsNoError)
 {
  JsRelease(property_id, 0);
  JsRelease(function, 0);
  return false;
 }
 return true;
}

注册到环境以后,就可以在脚本中调用这个函数了。

文章结束

以下是相关引用:

微软JSRT官方文档

Windows桌面或服务器环境下嵌入JavaScript支持(JSRT)的更多相关文章

  1. IIS服务器环境下某路径下所有PHP接口无法运行报500.19错误

    IIS服务器环境下某路径(文件夹)下所有PHP接口无法运行报500.19错误 环境:IIS8.5 + php7.2.1 错误描述:某目录下(如 d:\web\A)所有php接口文档运行错误,接口测试工 ...

  2. 浏览器环境下的javascript DOM对象继承模型

    这张图是我直接在现代浏览器中通过prototype原型溯源绘制的一张浏览器宿主环境下的javascript DOM对象模型,对于有效学习和使用javascript DOM编程起到高屋建瓴的指导作用, ...

  3. 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式

    1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...

  4. nginx+ftp搭建图片服务器(Windows Server服务器环境下)

    几种图片服务器的对比 1.直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg 不采用这种方式,不安全容易暴露ftp账户信息 2.直接使 ...

  5. Windows服务器环境下jenkins下载和安装

    1.下载jenkins 在windows系统上搭建jenkins持续集成有两种方法:1.war文件,可以用tomcat或者java命令直接运行2.msi安装,作为系统服务后台运行 下载地址 https ...

  6. php Windows系统 wamp集成环境下redis的使用

    先说一下我的本地环境,使用的是wamp集成环境,(Apache 2.4.9.PHP 5.5.12.MySQL 5.6.17) windows下安装PHP扩展: 第一步:找到扩展文件(.dll),htt ...

  7. windows桌面添加右键环境

    1.组合键win + R,输入regedit,回车   打开注册表编辑器 2.找到目录中[HKEY_CLASSES_ROOT\Directory\Background\shell]对其右键,新建一个项 ...

  8. 【SQL】服务器环境下的SQL

    一.大型数据库的三层体系结构 web服务器:比如在淘宝页面上,输入“牛肉干”,就是web服务器来处理,提交给应用服务器. 应用服务器:在获取到“牛肉干”这个请求后,应用服务器决定如何汇集结果,并进行相 ...

  9. 如何在Windows 2003+IIS6的环境下找回应用程序池(application pool)中的服务账号密码

    上一篇文章说了说如何在Win2008+iis7中取出SharePoint管理账号密码的方法. 整个过程简单的讲,就是通过使用要找回密码的账号用来在SharePoint中创建一个临时的Web Appli ...

随机推荐

  1. java模式—装饰者模式

    装饰者模式 1.意图: 动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. 2.适用环境 (1)在不影响其他 ...

  2. mybatis框架(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  3. CentOS7 安装中文输入法

    CentOS7输入中文,打开终端,使用管理员权限 su 输入管理员密码,回车 输入 yum install  ibus-libpinyin 回车,耐心等待安装完,然后重启系统 重启完后再进行前面的步骤 ...

  4. shell运算符与流程控制-2

    1.shell运算符 1.1.算数运算符 原生的bash不支持算数运算,可以通过其它方式实现例如expr. `expr a + b` #a b为数字,和运算符之间要有空格 #``不是单引号,为键盘上E ...

  5. Talk In Web Security(安全世界观): Devleping a Secure WebSite

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. Why to write about Web ...

  6. SpringBoot 启动概述

    透过现象看本质,SpringApplication 只是将一个典型的Spring应用的启动流程进行了扩展,因此,透彻理解 Spring 容器是打开 Spring Boot 大门的一把钥匙. Sprin ...

  7. How Tomcat works — 二、tomcat启动(1)

    主要介绍tomcat启动涉及到的一些接口和类. 目录 概述 tomcat包含的组件 server和service Lifecycle Container Connector 总结 概述 tomcat作 ...

  8. Go中iota是什么

    Go iota是一个比较奇怪的存在,它只能用在const的申明中,是一个从0开始的行数索引器. 看代码 package main import ( "fmt" ) const ( ...

  9. koa2入门使用总结

    koa2的介绍 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async ...

  10. 了解golang的可变参数(... parameters),这一篇就够了

    在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...