bdo*_*lan 5 vb6 com error-handling activex atl
我试图使用CComCoClass :: Error向VB6返回一个详细的错误,但似乎我只能返回错误代码/或/消息 - 但不是两者.
return Error(_T("Not connected"), __uuidof(IMyInterface), HRESULT_FROM_WIN32(ERROR_CONNECTION_INVALID));
Run Code Online (Sandbox Code Playgroud)
导致VB6端的Err.Description中的对象'IMyInterface'失败的通用"方法'请求'错误消息"(但Err.Number中的ERROR_CONNECTION_INVALID),而
return Error(_T("Not connected"));
Run Code Online (Sandbox Code Playgroud)
导致相应的错误消息,但Err.Number中的一般错误代码.我怎样才能充分利用这两个世界?
你不能,这似乎是设计的.详细信息如下,但简而言之,您有三种选择:
Method '~' of object '~' failed".
对于手头的任务,归结为两个选择:
VB运行时似乎只提供有关COM错误的非常有限的处理.这可能是出于特定于VB实现方式的历史和/或技术原因而不是特别感兴趣的(关键字将仅IDispatch与双接口和ActiveX作为COM的'子集').
虽然我无法针对上面列出的行为制定明确的规范,但可以通过挖掘其他来源来解决这个问题:
[...]调用GetErrorInfo方法以检索可用的错误信息.然后,运行时确定bstrDescription是否具有NULL以外的值.如果运行时发现的值不是NULL [...],则在此方案中使用原始HRESULT值.如果运行时发现NULL值,则[...] Visual Basic然后使用HRESULT查找相应的Visual Basic错误.
这解释了关于你的第一个例子的行为:你确实提供了一条错误消息,因此运行时只是转向它的通用消息" Method '~' of object '~' failed"加上你的HRESULT.
一旦您查看(第一个列出的)构造函数的定义,第二个示例的行为也是一致的CComCoClass::Error:它具有非指定参数的默认值,尤其是'hRes = 0'."备注"部分进一步指出"如果hRes为零,那么Error的前四个版本将返回DISP_E_EXCEPTION.".因此,这会隐式触发"服务器错误"传递行为.
最后,对于像自动化客户端行为这样的VB的具体C++实现示例,请参阅自动化Microsoft Office 97和Microsoft Office 2000中的段落"错误处理"和以下"练习5" .
| 归档时间: |
|
| 查看次数: |
2328 次 |
| 最近记录: |