JavaScript中捕获从用C++编写的ActiveX控件抛出的异常

3

我已经用C++编写了一个ActiveX控件,当控件中发生错误条件时会抛出(C++)异常。调用表示控件实例的对象的Javascript代码被try-catch块包围:

try
{
    var controlInstance = window.controlInstance;

    ... perform operations on controlInstance ...
}
catch (e)
{
    alert("something bad happened");
}

现在,当我在带有Visual Studio(2008)调试器的IE8(或7或6)下运行此代码时,无论控件是使用DEBUG编译还是不使用DEBUG编译,一切都按预期工作。然而,当在没有连接调试器的情况下运行浏览器时,当异常跨越控件和JScript之间的边界时,IE会崩溃(真的)。
有人对如何解决这个问题有什么建议吗?我意识到我可以更改控件的接口以将异常作为参数传递回来,但我真的不想做出这样的改变。
任何帮助都将不胜感激。
3个回答

2

你是如何从C++传递异常的?如果你想将异常传播到javascript,一般的throw是行不通的。你需要抛出类型为COleDispatchException的异常,正确的方法是调用:

AfxThrowOleDispatchException(101, _T("Exception Text Here")); // First parameter is exception code. 

参考文献:http://doc.sumy.ua/prog/active_x/ch03.htm#Heading20

(本文在参考文献中提到了与 ActiveX 相关的技术,建议读者查看原文以获得更加全面的信息。)

1

你不能将C++异常传递到脚本中 - 你需要在Invoke()/InvokeEx()中捕获C++异常,翻译它们并使用EXCEPINFO*参数传递出去。

例如,从FireBreath实现中摘录:

HRESULT YourIDispatchExImpl::InvokeEx(DISPID id, LCID lcid, WORD wFlags, 
                                      DISPPARAMS *pdp, VARIANT *pvarRes, 
                                      EXCEPINFO *pei, IServiceProvider *pspCaller)
{
    try {
        // do actual work
    } catch (const cppException& e) {
        if (pei != NULL) {
            pei->bstrSource = CComBSTR(ACTIVEX_PROGID);
            pei->bstrDescription = CComBSTR(e.what());
            // ...
        }
        return DISP_E_EXCEPTION;
    }

    // ...

1

你需要使用AtlReportError。它会抛出一个带有描述字符串的JavaScript异常:

STDMETHODIMP CMyCtrl::MyMethod()
{
   ...
   if (bSucceeded)
      return S_OK;
   else
      // hRes is set to DISP_E_EXCEPTION
      return AtlReportError (GetObjectCLSID(), "My error message");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接