代码之家  ›  专栏  ›  技术社区  ›  bdonlan

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

  •  5
  • bdonlan  · 技术社区  · 15 年前

    我正在尝试使用返回VB6的详细错误 CComCoClass::Error

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

    导致在VB6端的错误描述中出现对象“IMyInterface”失败的通用“方法”请求错误消息(但错误号中的错误连接无效),而

    return Error(_T("Not connected"));
    

    4 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    7 年前

    你不能,这似乎是故意的。详细信息如下,但简而言之,您有三种选择:

    • 不返回任何消息和VB友好的COM错误,即一个 众所周知的 由VB运行时根据此 KB article
    • 返回错误消息和显示异常;VB运行时将传递此“服务器错误”和自定义错误消息。这是在第二个示例中隐式发生的情况,请参见下面的详细信息。
    • 不返回任何消息和任何其他COM错误,即 不详 通过VB运行时;VB运行时将使用原始HRESULT加上通用消息“ Method '~' of object '~' failed ".
      • 请注意,如果您在此处提供错误消息,即您的消息将被忽略,则此运行时行为也适用!这是您的第一个示例中发生的情况,请参见下面的详细信息。

    对于手头的任务,可以归结为两种选择:

    • 如果您想为自动化客户端(如VB)提供上下文正确的“COM错误”(很可能您应该这样做),则必须省略自定义错误消息。
    • 在内部

    细节

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

    贾斯达雷默 pointed out already :

    […]打电话给 可用的错误信息。这个 bstrDescription的值不是 无效的如果运行时找到一个值 除了NULL、[…]之外,原始HRESULT 值在该场景中使用。如果 运行时发现空值[…] VisualBasic然后使用HRESULT

    这解释了与第一个示例有关的行为:您确实提供了一条错误消息,因此运行时仅使用其通用消息“ 对象“~”的方法“~”失败 “再加上你的 HRESULT .

    CComCoClass::Error :它具有非指定参数的默认值,尤其是“hRes=0”。“备注”部分进一步指出,“如果hRes为零,则前四个版本的错误返回DISP_E_EXCEPTION。”。因此,这会隐式触发“服务器错误”传递行为。

    Automating Microsoft Office 97 and Microsoft Office 2000 .

        2
  •  0
  •   sharptooth    15 年前

        3
  •  0
  •   Corin    15 年前

    我现在也在努力解决这个问题。到目前为止,我的挖掘表明错误代码实际上是HRESULT值。VB6试图聪明地解释HRESULT,但它所理解的HRESULT列表似乎相当有限。由于HRESULT VB6并不熟悉,它只是将HRESULT放入Err.Number属性中,并希望开发人员足够聪明,能够弄清楚如何使用它。

    我最接近返回错误号的方法是使用MAKE_SCODE生成一个HRESULT,其中HRESULT的代码字段设置为我想要的、严重性标志集,并且我希望是正确的工具。

    与CreateErrorInfo和SetErrorInfo一起,在VB6中为我提供一个错误代码和错误描述。这让我们回到VB6,它试图在有限的错误列表中保持智能。

        4
  •  0
  •   justadreamer    15 年前

    签出这篇文章 http://support.microsoft.com/kb/827994 . 因此,对象必须实现方法ISupportsErrorInfo::InterfaceSupportsErrorInfo(),该方法返回S_OK。然后在返回之前,必须使用指向实现IErrorInfo::GetDescription()的COM对象的指针调用SetErrorInfo。 这里有一个例子: http://msdn.microsoft.com/en-us/library/ms221409.aspx .

    如果在返回之前设置了ErrorInfo,VB将查询传递给SetErrorInfo的对象指针的GetDescription方法。