很多人比较关注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. 异步请求中jetty处理ServletRequestListener的坑

    标题起得比较诡异,其实并不是坑,而是jetty似乎压根就没做对异步request的ServletRequestListener的特殊处理,如果文中有错误欢迎提出,可能自己有所疏漏了. 之前遇到了一个b ...

  2. Chapter 4 Invitations——8

    "So," Mike said, looking at the floor, "Jessica asked me to the spring dance." “ ...

  3. Spring Boot 系列(九)数据层-集成Spring-data-jpa

    实际开发中,不可避免地会对数据进行反复的增删改查操作,然而这部分工作是十分繁琐枯燥的.那么,随即而生的ORM框架就能很好的解决这个问题. 我们常用的ORM框架有:Hibernate.Mybatis.J ...

  4. Windows 下获取硬盘序列号

    只获取序列号 以下任意一条命令都可以: wmic diskdrive get serialnumber wmic path win32_physicalmedia get SerialNumber w ...

  5. Linux常用命令之文件和目录处理命令

    目录 1.Linux命令的普遍语法格式 2.目录处理命令 一.显示目录文件命令:ls 二.创建目录命令:mkdir 三.切换目录命令:cd 四.shell内置命令和外部命令的区别 五.显示当前目录命令 ...

  6. 弹窗查看内容时 内容滚动区域设置为body区

    看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动 什么意思呢? 看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动 点 ...

  7. java8 集合求差集、并集、交集

    前言 java8里最大亮点是lambda,让我们用习惯C# linq的语法,也能眼前一亮.但是比起C#的语法糖还是差的很远. 差集.并集.交集 @Test public void test1(){ L ...

  8. word2vec初探

    在自然语言处理入门里我们提到了词向量的概念,tf-idf的概念,并且在实际的影评正负面预测项目中使用了tf-idf,取得了还算不错的效果.这一篇,我们来尝试一下使用来自google的大名鼎鼎的word ...

  9. R语言实战(二)——数据分析基础知识

    一.R中数据结构 1.数据集 通常是由数据构成的一个矩形数组,行 表示 观测(记录.示例),列 表示 变量(字段.属性) 2.R中的数据结构 3.向量 c()可以用来创建向量 > a <- ...

  10. 【转】没那么难,谈CSS的设计模式

    什么是设计模式? 曾有人调侃,设计模式是工程师用于跟别人显摆的,显得高大上:也曾有人这么说,不是设计模式没用,是你还没有到能懂它,会用它的时候. 先来看一下比较官方的解释:“设计模式(Design p ...