4

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

这就是我想要做的。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 边界上抛出一个不会使调用者崩溃的异常。

4

2 回答 2

4

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

  • 所有接口都必须从 IDispatch 派生
  • 一个组件类应该只实现一个源接口
  • 所有方法都必须返回 HRESULT,只有 STDMETHODIMP 有效
  • 参数类型必须限制为自动化允许的子集。

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

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

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

您通过返回失败 HRESULT 在脚本客户端中生成异常。

于 2012-09-26T19:26:29.430 回答
1

您可以通过以下方式让客户端处理“异常”

  1. 像你说的那样设置 IErrorInfo
  2. 返回非 HRESULT hr != S_OK

因此,您需要 IDispatch/Interop 兼容接口,这需要 HRESULT 返回类型 (AFAIR)。

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

于 2012-09-26T18:41:04.240 回答