com - 如何从 ATL activex 控件向 VB6 返回错误字符串和错误代码?

标签 com vb6 error-handling activex atl

我正在尝试使用 CComCoClass::Error 将详细错误返回给 VB6 ,但似乎我只能返回错误代码/或/消息 - 但不能同时返回。

return Error(_T("Not connected"), __uuidof(IMyInterface), HRESULT_FROM_WIN32(ERROR_CONNECTION_INVALID));

在 VB6 端的 Err.Description 中导致通用的“对象‘IMyInterface’的方法‘请求’失败”错误消息(但在 Err.Number 中为 ERROR_CONNECTION_INVALID),而
return Error(_T("Not connected"));

导致相应的错误消息,但 Err.Number 中的通用错误代码。我怎样才能做到两全其美?

最佳答案

你不能,这似乎是设计使然。详情如下,但简而言之,您有三个选择:

  • 不返回任何消息和一个 VB 友好的 COM 错误,即一个 知名 由 VB 运行时根据此 KB article ; VB 运行时会将此“COM 错误”转换为 VB 错误加消息。
  • 返回错误信息和 DISP_E_EXCEPTION; VB 运行时将通过此“服务器错误”和您的自定义错误消息。这就是您的第二个示例中隐含的情况,有关详细信息,请参见下文。
  • 不返回任何消息和任何其他 COM 错误,即一个 未知 通过 VB 运行时; VB 运行时将求助于原始 HRESULT 加上通用消息“Method '~' of object '~' failed”。
  • 请注意,此运行时行为也适用,如果您确实在此处提供了错误消息,即您的消息将被忽略!这就是您的第一个示例中发生的情况,有关详细信息,请参见下文。

  • 对于手头的任务,它归结为两个选择:
  • 如果您想为 VB 等自动化客户端提供上下文正确的“COM 错误”(您可能应该这样做),您必须省略自定义错误消息。
  • 如果您想为“服务器错误”提供自定义错误消息(即关于 功能的自定义错误条件 您的自动化服务器),您唯一的选择是 DISP_E_EXCEPTION。


  • 细节

    VB 运行时似乎只对 COM 错误提供非常有限的处理。这可能是由于特定于 VB 实现方式的历史和/或技术原因,在这里不是特别感兴趣(关键字将是 IDispatch only vs dual interface 和 ActiveX 作为 COM 的“子集”)。

    虽然我无法为上述行为提供明确的规范,但可以通过挖掘其他来源来理解:

    来自 KB article justadreamer pointed out already :

    [...] a call is made to the GetErrorInfo method to retrieve the available error information. The runtime then determines whether bstrDescription has a value other than NULL. If the runtime finds a value other than NULL, [...], the raw HRESULT value is used in this scenario. If the runtime finds a NULL value, [...] Visual Basic then uses HRESULT to look up the corresponding Visual Basic error.



    这解释了有关您的第一个示例的行为:您确实提供了一条错误消息,因此运行时只是求助于其通用消息“Method '~' of object '~' failed”加上您的 HRESULT .

    一旦您查看 CComCoClass::Error 的(第一个列出的)构造函数的定义,您的第二个示例的行为也是一致的。 :它具有非指定参数的默认值,尤其是“hRes = 0”。 “备注”部分进一步指出“如果 hRes 为零,则错误的前四个版本返回 DISP_E_EXCEPTION。”。因此,这会隐式触发“服务器错误”传递行为。

    最后,对于类似 VB 的自动化客户端行为的具体 C++ 实现示例,请参见示例段落“错误处理”和 Automating Microsoft Office 97 and Microsoft Office 2000 中的以下“练习 5”。 .

    关于com - 如何从 ATL activex 控件向 VB6 返回错误字符串和错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1069585/

    相关文章:

    excel - Delphi 控制 Excel - 创建数据透视表和图表

    python - boto3 S3 : get_object error handling

    angular - 使用 Material Design 的 Angular2 应用程序的一般错误处理程序

    batch-file - 如何从批处理文件中提取错误描述

    c# - 让 .net 应用程序和 vb6 应用程序互相交谈?

    com - 在经典 asp 中调用长时间运行的 vb6 com 对象..超时错误

    c# - Excel DNA - 在回调中将 C# 字符串编码到 VBA ByRef

    c++ - 了解 tagVARIANT 结构

    java - 从 Visual Basic 6 调用 Java 方法

    vb6 - 无法注册 VB ocx 组件(错误 0x80040201)