做了一个自定函数(主要是访问数据库用的)com1,这里面的函数是可配置的如:fn1(a,b)fn2(,1,2,3)
fn1,fn2。
com1.caculate("fn(a,b)")这是没问题的。
现在想与script结合起来(不想自己解析):能计算如:com2.caulate("(1+2)*fn((3+4),5)")
问题在于com1中并不能把fn1作为一个支持idispath接口的,它是动态定义出来的。加入IActiveScriptSite后
script如何能解析出fn(a,b)来呢?
不知我描述的清楚么?请大家给点指点
我想过将这些fn1预先定义成本个文本
如:function fn(a,b)
{
return caculate("fn(a,b)");
}
这样的形式,然后将这样和要计算的语句一起加载。但这样的话,每次计算都要加载很多内容。
fn1,fn2。
com1.caculate("fn(a,b)")这是没问题的。
现在想与script结合起来(不想自己解析):能计算如:com2.caulate("(1+2)*fn((3+4),5)")
问题在于com1中并不能把fn1作为一个支持idispath接口的,它是动态定义出来的。加入IActiveScriptSite后
script如何能解析出fn(a,b)来呢?
不知我描述的清楚么?请大家给点指点
我想过将这些fn1预先定义成本个文本
如:function fn(a,b)
{
return caculate("fn(a,b)");
}
这样的形式,然后将这样和要计算的语句一起加载。但这样的话,每次计算都要加载很多内容。
执行一段代码:计算类似于:(1+2)*fn(3+4,5)
其中fn(a,b)这是一个自定函数,是从数据库中查询数据。 类似的函数有fn1,fn2,fn3。这些函数是在一个
ini文件中配置好的。
如:[fn1]
paras=2
[fn2]
paras=3
......
目前做了个com 实现了一个函数caculate(string Fn)
a=com.caculate("fn(11,01)") 这个a就是fn(11,10)的返回结果
问题是怎么实现:(1+2)*fn(3+4,5)这样的内容?不要叫我自己写词法解析,我上次写了一个,现在我想用执行javascript或
vbscript这样的方式来实现
2、调用IActiveScript::AddNamedItem(L"db", 0) 来添加这个对象进去,可以取名叫做db,在脚本里面等效于存在一个全局变量 var db;
3、调用IActiveScriptParse::ParseScriptText来执行一段脚本代码,比如"fn(11, 1);" 或者 "(1+2)*fn(3+4,5);",大致如下:CComVariant varRet;
EXCEPINFO ei;
asp->ParseScriptText(L"(1+2)*fn(3+4,5)", L"db", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &varRet, &ei);
现在表达式的值就保存在varRet里面了
不想每次重新生成一个com.
function fn1(){ return basefn1()*basefn2(); }
function fn2(){ return 35*basefn1() + basefn3(); }
甚至脚本扩充的方法从配置文件读取,比如某个算法要求求值 "fn1()*52 - fn2()",把这个串读出来后调用eval就行了
var str = "fn1()*52-fn2()";
var tmp;
eval("tmp = " + str);
现在tmp变量里就是表达式的值
我想过将这些fn1预先定义成本个文本
如:function fn(a,b)
{
return caculate("fn(a,b)");
}
这样的形式,然后将这样和要计算的语句一起加载。但这样的话,每次计算都要加载很多内容。
大家再看看有没有更好的办法,过几天结贴了。
谢谢大家关注