如何从C ++引发异常将触发脚本异常处理程序

时间:2012-09-26 18:33:39

标签: c++ exception com atl abi

我一直在网上找到这个答案的点点滴滴,但不是一个明确的解决方案。

这就是我想要做的。 1)创建一个ATL简单对象。 2)向该对象添加一个返回BOOL的方法,而不是HRESULT。调用者想要真/假返回值。 3)向将提供e.description和e.number数据的jscript或vbscript调用者抛出异常。

RE 2)我发现我可以使用STDMETHODIMP_(BOOL)和[local]来允许BOOL返回RE 3)我发现我可以通过SetErrorInfo()传递IErrorInfo来填充Error对象

我的困境是我无法弄清楚如何构建C ++以在ABI边界上抛出一个不会使调用者崩溃的异常。

2 个答案:

答案 0 :(得分:4)

为脚本客户端编写代码时,必须使用名为Automation的COM子集。这决定了:

  • 所有接口必须从IDispatch
  • 派生
  • 一个coclass应该只实现一个源接口
  • 所有方法必须返回HRESULT,只有STDMETHODIMP有效
  • 参数类型必须限制在Automation允许的子集中。

特别是这意味着不允许BOOL,它必须是VARIANT_BOOL。你声明一个方法,通过在IDL中写这样的方式返回一个布尔值:

 [id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);

在代码中将VARIANT_TRUE或VARIANT_FALSE指定给* retval。脚本语言使用自然语法,如var = Foo()

通过返回故障HRESULT在脚本客户端生成异常。

答案 1 :(得分:1)

您可以通过

使客户端处理“例外”
  1. 像你说的那样设置IErrorInfo
  2. 返回非HRESULT hr!= S_OK
  3. 因此,您需要IDispatch / Interop兼容接口,这需要HRESULT返回类型(AFAIR)。

    IDL允许更多,但“动态”客户端(如脚本主机(VBS,JScript,VBA和其他))不会消耗那些本机,因此互操作性不会是最佳的