我一直在网上找到这个答案的点点滴滴,但不是一个明确的解决方案。
这就是我想要做的。 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边界上抛出一个不会使调用者崩溃的异常。
答案 0 :(得分:4)
为脚本客户端编写代码时,必须使用名为Automation的COM子集。这决定了:
特别是这意味着不允许BOOL,它必须是VARIANT_BOOL。你声明一个方法,通过在IDL中写这样的方式返回一个布尔值:
[id(42)] HRESULT Foo([out,retval] VARIANT_BOOL* retval);
在代码中将VARIANT_TRUE或VARIANT_FALSE指定给* retval。脚本语言使用自然语法,如var = Foo()
。
通过返回故障HRESULT在脚本客户端生成异常。
答案 1 :(得分:1)
您可以通过
使客户端处理“例外”因此,您需要IDispatch / Interop兼容接口,这需要HRESULT返回类型(AFAIR)。
IDL允许更多,但“动态”客户端(如脚本主机(VBS,JScript,VBA和其他))不会消耗那些本机,因此互操作性不会是最佳的