VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 958|回复: 9

[已解决] 用msscript.ocx控件调用JS函数怎么得不到返回的错误?

[复制链接]
63_avatar_middle
online_vip 发表于 2016-10-27 23:03:14 | 显示全部楼层 |阅读模式
本帖最后由 syxwange 于 2016-11-2 21:07 编辑


#include "stdafx.h"


#import "C:/windows/system32/msscript.ocx"  no_namespace

int main()
{
        CoInitialize(NULL);
        IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
       
        pScriptControl->Language = "JavaScript";
       
        LPCTSTR szJsText = _T("function jsfunc(){return add(4);}function add(a,b){return a+b; }function error(){return bb(4);}");
       
        pScriptControl->AddCode(szJsText);
       
       
        LPSAFEARRAY psa;
        SAFEARRAYBOUND rgsabound[] = {2,0};
        psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
        _variant_t vValue[2];
        vValue[0] = 5;
        vValue[1] = 15;
        long lZero = 0;
        long lOne = 1;
        SafeArrayPutElement(psa, &lZero, &vValue[0]);
        SafeArrayPutElement(psa, &lOne, &vValue[1]);


        //这个能正常执行
        VARIANT ret1 = pScriptControl->Run(_T("add"), &psa);
        //这里故意调用一个错误的JS函数想得到一个错误
        VARIANT ret2 = pScriptControl->Eval (_T("jsfunc()"));
       

        //怎么得不到错误?或这错误要怎么得到?
        IScriptError  *aa;
        HRESULT hr = pScriptControl->get_Error(&aa);
        LPCTSTR str = aa->GetText();
        BSTR  bb;
        long cc;
        hr = aa->get_Text(&bb);
        hr = aa->get_Line(&cc);

       
        //CoUninitialize();

        _tsystem(_T("pause"));

    return 0;
}





上一篇:WebBrowser简易浏览器代理问题
下一篇:线程同步 和 函数中顺序执行有什么区别?
51_avatar_middle
online_admins 发表于 2016-10-28 16:18:29 | 显示全部楼层
加上 try-catch 应该能捕获到异常信息的
63_avatar_middle
ico_lz  楼主| 发表于 2016-10-29 14:54:50 | 显示全部楼层
Syc 发表于 2016-10-28 16:18
加上 try-catch 应该能捕获到异常信息的

我主要想知道 IScriptError  的get_Text(&bb)和get_Line(&cc);的用法,如加载一个JS文件,得到错误后返回错误JS代码和代码所在的行数,以便查找JS代码的错误
63_avatar_middle
ico_lz  楼主| 发表于 2016-10-29 15:30:48 | 显示全部楼层
Syc 发表于 2016-10-28 16:18
加上 try-catch 应该能捕获到异常信息的

同时我用try-catch没有捕获到异常
51_avatar_middle
online_admins 发表于 2016-10-31 10:39:41 | 显示全部楼层
syxwange 发表于 2016-10-29 15:30
同时我用try-catch没有捕获到异常


试了楼主的代码,如果使用  VARIANT ret2 = pScriptControl->Eval (_T("jsfunc()")); 这句调用的话不会引发异常,如果调用的是:
VARIANT ret2 = pScriptControl->Eval(_T("error()"));
这句话的话可以引发异常,之后使用:
try
{}
catch (_com_error& e)
{}

也可以捕获到异常信息。
之后使用 _bstr_t err = e.Description(); 就可以得到错误信息
63_avatar_middle
ico_lz  楼主| 发表于 2016-10-31 18:28:41 | 显示全部楼层
Syc 发表于 2016-10-31 10:39
试了楼主的代码,如果使用  VARIANT ret2 = pScriptControl->Eval (_T("jsfunc()")); 这句调用的话不会引 ...

谢谢你的回复,但我关键是想知道 IScriptError  的get_Text(&bb)和get_Line(&cc);的用法,如加载一个JS文件,得到错误后返回错误JS代码和代码所在的行数,以便查找JS代码的错误
51_avatar_middle
online_admins 发表于 2016-10-31 21:22:35 | 显示全部楼层
syxwange 发表于 2016-10-31 18:28
谢谢你的回复,但我关键是想知道 IScriptError  的get_Text(&bb)和get_Line(&cc);的用法,如加载一个JS文 ...

正常的用法就是这样的,楼主可以试试加载个 js 文件,里面故意写一些语法错误的情况,看看会不会报出来!
我之前封装的 IScriptControl 接口的代码就是这样写的
63_avatar_middle
ico_lz  楼主| 发表于 2016-11-1 14:13:28 | 显示全部楼层
Syc 发表于 2016-10-31 21:22
正常的用法就是这样的,楼主可以试试加载个 js 文件,里面故意写一些语法错误的情况,看看会不会报出来! ...

我就是故意写错JS语法,用IScriptError  的get_Text(&bb)和get_Line(&cc);得不要JS文件中报错的行和代码。
所以向你请教 IScriptError  的get_Text(&bb)和get_Line(&cc);的用法,
51_avatar_middle
online_admins 发表于 2016-11-1 15:40:27 | 显示全部楼层
syxwange 发表于 2016-11-1 14:13
我就是故意写错JS语法,用IScriptError  的get_Text(&bb)和get_Line(&cc);得不要JS文件中报错的行和代码 ...

获得错误信息使用 get_Description
获得错误的行号:get_Line
列号:get_Column

具体代码如下:
  1. #include "stdafx.h"
  2. #include<stdio.h>
  3. #include<iostream>
  4. using namespace std;
  5. #import "C:/windows/system32/msscript.ocx"  no_namespace

  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.         CoInitialize(NULL);
  9.         IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
  10.         try
  11.         {
  12.                 pScriptControl->Language = "JavaScript";

  13.                 LPCTSTR szJsText = _T("function jsfunc(){return add(4);};function add(a,b){return a+b; };function error(){return bb(4);}");
  14.                 HRESULT hr = pScriptControl->AddCode(szJsText);

  15.                 LPSAFEARRAY psa;
  16.                 SAFEARRAYBOUND rgsabound[] = { 2, 0 };
  17.                 psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
  18.                 _variant_t vValue[2];
  19.                 vValue[0] = 5;
  20.                 vValue[1] = 15;
  21.                 long lZero = 0;
  22.                 long lOne = 1;
  23.                 SafeArrayPutElement(psa, &lZero, &vValue[0]);
  24.                 SafeArrayPutElement(psa, &lOne, &vValue[1]);
  25.                 //这个能正常执行
  26.                 VARIANT ret1 = pScriptControl->Run(_T("add"), &psa);
  27.                 //这里故意调用一个错误的JS函数想得到一个错误
  28.                 VARIANT ret2 = pScriptControl->Eval(_T("error()"));
  29.         }
  30.         catch (_com_error& e)
  31.         {
  32.                 _bstr_t errDesp = e.Description();
  33.                 const TCHAR *errMsg = e.ErrorMessage();

  34.                 IScriptError  *pScrError = NULL;
  35.                 HRESULT hr = pScriptControl->get_Error(&pScrError);
  36.                 _bstr_t str = pScrError->GetText();
  37.                 BSTR bstrText;
  38.                 long lRow = -1, lCol = -1;
  39.                 hr = pScrError->get_Description(&bstrText);
  40.                 hr = pScrError->get_Line(&lRow);
  41.                 hr = pScrError->get_Column(&lCol);
  42.         }

  43.         return 0;
  44. }
复制代码
63_avatar_middle
ico_lz  楼主| 发表于 2016-11-2 21:06:09 | 显示全部楼层
Syc 发表于 2016-11-1 15:40
获得错误信息使用 get_Description
获得错误的行号:get_Line
列号:get_Column

谢谢你,问题已解决了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-19 12:49

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表