我正在尝试使用 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 中的通用错误代码。我怎样才能做到两全其美?
最佳答案
你不能,这似乎是设计使然。详情如下,但简而言之,您有三个选择:
Method '~' of object '~' failed
”。对于手头的任务,它归结为两个选择:
细节
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/