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

C++ 如何从C++;这将触发脚本异常处理程序,c++,exception,com,atl,abi,C++,Exception,Com,Atl,Abi,我一直在网上找到这个答案的点点滴滴,但不是一个非常清晰的解决方案 这就是我要做的。 1) 创建一个ATL简单对象。 2) 向该对象添加一个返回BOOL而不是HRESULT的方法。调用者需要true/false返回值。 3) 向将提供e.description和e.number数据的jscript或vbscript调用程序抛出异常 RE 2)我发现我可以使用STDMETHODIMP((BOOL)和[local]来允许返回BOOL RE 3)我发现我可以通过SetErrorInfo()传递IErro

我一直在网上找到这个答案的点点滴滴,但不是一个非常清晰的解决方案

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

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


我的两难问题是,我无法理解如何构造C++在ABI边界上抛出一个不会崩溃的异常。< /P> < p>您可以通过< /p>使客户端处理“异常”。

  • 像你说的那样设置信息
  • 返回非HRESULT hr!=好的
  • 因此,您需要与IDispatch/Interop兼容的接口,这些接口需要HRESULT返回类型(AFAIR)


    IDL允许更多,但像脚本主机(VBS、JScript、VBA和其他)这样的“动态”客户端不会本地使用这些主机,因此互操作性将不是最佳的。

    当您为脚本客户端编写代码时,必须使用称为自动化的COM子集。这说明:

    • 所有接口都必须从IDispatch派生
    • 一个coclass应该只实现一个源接口
    • 所有方法都必须返回HRESULT,只有STDMETHODIMP有效
    • 参数类型必须限制为自动化允许的子集
    特别是,这意味着不允许BOOL,它必须是VARIANT_BOOL。您可以通过在IDL中这样编写来声明一个返回布尔值的方法:

     [id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);
    
    将VARIANT_TRUE或VARIANT_FALSE指定给代码中的*retval。脚本语言使用自然语法,如
    var=Foo()


    您通过返回一个失败的Hebug来生成脚本客户端中的异常。

    我不相信您可以跨越ABI边界抛出C++异常。那怎么行?谢谢你的输入。那么,没有办法从C++中触发脚本中的catch块吗?如果没有,您会建议我如何实现最佳实施?我相信我遇到过一个帖子,上面说你可以通过Invoke/InvokeEx来实现这一点,但我不知道如何实现代码。如果我将STDMETHODIMP_2;(BOOL)作为返回类型而不是HRESULT返回,这会起作用吗?此外,这是否会自动调用脚本调用方捕获块?或者只是返回一个我必须在呼叫端主动检查的号码?不,因为这不会返回HRESULT。是的,你左边的老式手册(
    C-style
    )错误检查这正是它应该工作的。错误的性质应该在error info实例中描述,但是实际的COM方法应该返回失败位(0x8000000),这正是sehe所描述的。谢谢WhozCraig。那么,我必须牺牲将BOOL返回给调用者的能力才能让它工作吗?或者我还能把真假寄回去吗?调用方需要一个bool.+implement
    ISupportErrorInfo
    来指示
    IErrorInfo
    已有效设置,需要查询。非常感谢!我是COM的初学者。我不得不说,这肯定是一个比我预期的更愉快的回答。谢谢你。