//使用前已经初始化com
HRESULT hr;
IScriptControlPtr   pScriptControl; 
hr = pScriptControl.CreateInstance(__uuidof(ScriptControl));
//如果创建实例失败
if(hr != S_OK)
{
     return false;
}
LPSAFEARRAY psa;
//省略给psa参数赋值
_variant_t outpar;
BSTR vTemp;
vTemp = _com_util::ConvertStringToBSTR("JScript");
pScriptControl->put_Language(vTemp);
SysFreeString(vTemp);
pScriptControl->put_AllowUI(FALSE);//若脚本出现对话框, 并希望在响应之前, C++ 的窗口要等待, 则用 TRUE 
pScriptControl->Timeout = -1;//-1不允许超时操作
//加入脚本
BSTR vTemp;
vTemp = _com_util::ConvertStringToBSTR(RuleScript.GetBuffer());//RuleScript是脚本内容,作为函数参数传进来,全是实验正确的脚本代码
pScriptControl->AddCode(_bstr_t(vTemp));
outpar = pScriptControl->Run(_bstr_t("main"), &psa);
pScriptControl.Release();
以上代码需要循环执行多次经常在pScriptControl->AddCode处报com_error 说存储空间不足,无法执行操作。总起来,每个脚本都是可以运行的,不知道触到那根神经就会报“存储空间不足,无法执行操作”,只要报了,以后任何脚本休想执行了。

解决方案 »

  1.   

    //加入脚本
    BSTR vTemp;
    vTemp = _com_util::ConvertStringToBSTR(RuleScript.GetBuffer());//RuleScript是脚本内容,作为函数参数传进来,全是实验正确的脚本代码
    //RuleScript是CString?是的话就要调用RuleScript.ReleaseBuffer()了
    pScriptControl->AddCode(_bstr_t(vTemp));
    outpar = pScriptControl->Run(_bstr_t("main"), &psa);
    pScriptControl.Release();
    最后你有调用SysFreeString(vTemp )吗?
      

  2.   

    这个我解决了,是我不小心把堆栈设置太大了,导致函数的堆栈分配不够用了。懒啊,vTemp使用多次是复制粘帖的,也没人看我的代码,领导们都只看界面的。.net比较吃香,虽然实现的功能不是自己写的,但是表现快、效率高,容易被肤浅的领导赏识。