以前我们的写一个程序可能只用一种语言,我用的最多就是c++,但是现在的局势和需求它已经不能满足我们的需求,很多程序都需要能有自己的皮肤,有更好的扩展性,最近研究了一下Firefox,它真把xml和js用到了极致!因为它内部就潜着自己的js引擎,所有的界面用XUL(其实就是XML),一些Action都用的js来写的,扩展性极强!所以我就自然想到为何我们不能用它的js引擎呢?有了它的js引擎我们可以很简单的让js和c互调了,firefox是开源的你可以到Mozilla的网站去下载js的源代码,js的dll你可以在firefox下找到一个叫js3250.dll的东东!
让我们先看看code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 包含JS引擎API头文件 */
#define XP_WIN
#include "jsapi.h"
#define DOIT_MINARGS 1
static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
/*
* Look in argv for argc actual parameters, set *rval to return a
* value to the caller.
*/
printf("Call doit function() ");
if(argc > 0)
{
printf(JS_GetStringBytes(JS_ValueToString (cx, argv[0])));
}
*rval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"xingxing"));
return JS_TRUE;
}
/* 主程序建立全局JS变量,包括运行时,
* 一个上下文,和一个全局对象,然后初始化JS运行时,
* 并创建一个上下文. */
int main(int argc, char **argv)
{
int c, i;
/*建立全局的JS变量,包括全局和自定义对象 */
JSString* jss;
char buf[5120] = {0};
jsval rval;
JSVersion version;
JSRuntime *rt;
JSContext *cx;
JSObject *glob, *it;
JSBool builtins;
/* 初始化JS运行时,并返回结果给rt */
rt = JS_NewRuntime(8L * 1024L * 1024L);
/* 如果rt没有值,结束程序 */
if (!rt)
return 1;
/* 新建一个上下文并且把它和JS运行时相关联 */
cx = JS_NewContext(rt, 8192);
/* 如果cx没有值,在此结束程序 */
if (cx == NULL)
return 1;
JSClass global_class = {
"global",0,
JS_PropertyStub, JS_PropertyStub,JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub,JS_ConvertStub, JS_FinalizeStub };
/* 新建全局对象 */
glob = JS_NewObject(cx, &global_class, NULL, NULL);
/* 初始化内置JS对象和全局对象 */
builtins = JS_InitStandardClasses(cx, glob);
// 定义一个自定义函数到js中
JS_DefineFunction(cx, glob, "doit", doit, DOIT_MINARGS, 0);
/*打开文件,读入脚本*/
FILE *fp=NULL;
if (!(fp = fopen ("test.js", "r")))return 0;
int len = fread (buf, 1, 5120, fp);
fclose (fp);
if (len <= 0)return 0;
/*执行一段脚本*/
JSBool bOk = JS_EvaluateScript(cx, glob, buf, len, "", 1, &rval);
if (bOk == JS_TRUE)
{
jss = JS_ValueToString (cx, rval);
printf("The result is: %s", JS_GetStringBytes (jss));
}
else
{
printf("JS_EvaluateScript error!/n");
}
//这里调用js的函数
bOk = JS_CallFunctionName(cx, glob, "OnTest", 0, NULL, &rval);
/*释放上下文*/
JS_DestroyContext(cx);
/*释放RunTime*/
JS_DestroyRuntime(rt);
system("PAUSE");
return 0;
}
#include <stdlib.h>
#include <string.h>
/* 包含JS引擎API头文件 */
#define XP_WIN
#include "jsapi.h"
#define DOIT_MINARGS 1
static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
/*
* Look in argv for argc actual parameters, set *rval to return a
* value to the caller.
*/
printf("Call doit function() ");
if(argc > 0)
{
printf(JS_GetStringBytes(JS_ValueToString (cx, argv[0])));
}
*rval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx,"xingxing"));
return JS_TRUE;
}
/* 主程序建立全局JS变量,包括运行时,
* 一个上下文,和一个全局对象,然后初始化JS运行时,
* 并创建一个上下文. */
int main(int argc, char **argv)
{
int c, i;
/*建立全局的JS变量,包括全局和自定义对象 */
JSString* jss;
char buf[5120] = {0};
jsval rval;
JSVersion version;
JSRuntime *rt;
JSContext *cx;
JSObject *glob, *it;
JSBool builtins;
/* 初始化JS运行时,并返回结果给rt */
rt = JS_NewRuntime(8L * 1024L * 1024L);
/* 如果rt没有值,结束程序 */
if (!rt)
return 1;
/* 新建一个上下文并且把它和JS运行时相关联 */
cx = JS_NewContext(rt, 8192);
/* 如果cx没有值,在此结束程序 */
if (cx == NULL)
return 1;
JSClass global_class = {
"global",0,
JS_PropertyStub, JS_PropertyStub,JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub,JS_ConvertStub, JS_FinalizeStub };
/* 新建全局对象 */
glob = JS_NewObject(cx, &global_class, NULL, NULL);
/* 初始化内置JS对象和全局对象 */
builtins = JS_InitStandardClasses(cx, glob);
// 定义一个自定义函数到js中
JS_DefineFunction(cx, glob, "doit", doit, DOIT_MINARGS, 0);
/*打开文件,读入脚本*/
FILE *fp=NULL;
if (!(fp = fopen ("test.js", "r")))return 0;
int len = fread (buf, 1, 5120, fp);
fclose (fp);
if (len <= 0)return 0;
/*执行一段脚本*/
JSBool bOk = JS_EvaluateScript(cx, glob, buf, len, "", 1, &rval);
if (bOk == JS_TRUE)
{
jss = JS_ValueToString (cx, rval);
printf("The result is: %s", JS_GetStringBytes (jss));
}
else
{
printf("JS_EvaluateScript error!/n");
}
//这里调用js的函数
bOk = JS_CallFunctionName(cx, glob, "OnTest", 0, NULL, &rval);
/*释放上下文*/
JS_DestroyContext(cx);
/*释放RunTime*/
JS_DestroyRuntime(rt);
system("PAUSE");
return 0;
}
#include "jsapi.h" 这个文件就是我们需要从源代码中拿到的头文件,这里可以下载
test.js的代码
doit("wangweixing2000"); //这里调用c的函数
function OnTest() //js的函数
{
doit("OnTest");
}
function OnTest() //js的函数
{
doit("OnTest");
}
运行的结果我们会看到打印出来的信息是:
wangweixing2000
OnTest
说明,你需要找到js3250.dll和nspr4.dll找到copy到你的目录,然后把js3250.dll改名为js32.dll
你需要把下载的js代码用vc编译一下会出来一个js.lib文件也copy你的项目中,
一切ok,还等什么试试!!
有了这个东东,我们的程序也就可以支持解析脚本了,:)!
js用得地方比较多我们用得vs的ide到处都用js写的,你最喜欢的向导都是通过html页面加js写的!!!
希望这篇文章能对你有用,好久没有来更新我的blog了!:),喜欢就多多支持哦!