做了一个自定函数(主要是访问数据库用的)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)");
      }
    这样的形式,然后将这样和要计算的语句一起加载。但这样的话,每次计算都要加载很多内容。

解决方案 »

  1.   

    好吧,实现以下功能:
       执行一段代码:计算类似于:(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.   

    1、你要实现一个IDispatch,提供若干个方法fn、fn1、fn2...,这些方法都是用来执行某些计算的,比如从数据库中查询数据。
    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里面了
      

  3.   

    要支持javascript对对象的扩展的话,还要实现IDispatchEx。
      

  4.   

    如果用IDispatch实现fn,fn1意义不大,因为fn,fn1是通过配置去管理的。在不同的时间或项目里是不同的
    不想每次重新生成一个com.
      

  5.   

    IDispatch只实现脚本无法实现的基础功能(比如访问数据库),要变换功能,在脚本里面做就好了,比如IDispatch实现了basefn1/basefn2/basefn3等基本方法,在脚本里面可以扩充高级方法,比如 
    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变量里就是表达式的值
      

  6.   


     我想过将这些fn1预先定义成本个文本 
        如:function fn(a,b) 
          { 
            return caculate("fn(a,b)"); 
          } 
        这样的形式,然后将这样和要计算的语句一起加载。但这样的话,每次计算都要加载很多内容。
      

  7.   

    已实现了,还是采取预定义加载转换的script去实现的。
    大家再看看有没有更好的办法,过几天结贴了。
    谢谢大家关注