VB事件接收器如何返回HRESULT值?

jinliu 2004-11-12 08:12:56
使用ATL写一个COM DLL,其中有一个事件接口方法:
dispinterface _IBoxEvents
{
[id(3), helpstring("分钟数据查询")] HRESULT OnQueryMinData([in]int iPort,[in]int cKeyIndex);
};

采用VB做客户程序,VB自动生成的事件响应函数为一个Sub(好象应该为一个副Function):
Private Sub BoxEvents_OnQueryMinData(ByVal iPort As Long, ByVal cKeyIndex As Long,)

End Sub

通过在COM DLL中检查,调用VB事件接收函数后的返回值为0(S_OK),我如何在Private Sub BoxEvents_OnQueryMinData中返回其他的HRESULT值来表示一个错误,我尝试将Private Sub改为Private Function,但VB不允许。
...全文
222 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinliu 2004-11-15
  • 打赏
  • 举报
回复
不好意思,因为我没有使用过VB,别人要在VB中使用我的COM,我叫它对事件接收函数返回一个值表示正确与否,结果不能搞定,我如下实验了一下:
在COM 中
try
{
hr=Fire_OnQueryMinData(iPort,cKeyIndex,iHour,iMin);
OutputDebugString("OK");
}
catch(_com_error& e)
{
OutputDebugString((char*)(e.Description()));
}
在VB中:
Private Sub BoxEvents_OnQueryMinData(ByVal iPort As Long, ByVal cKeyIndex As Long,)
Label3.Caption = "1111"
Err.Raise vbObjectError + 513
End Sub

结果COM中的catch 不能截获VB中raise,所以我决定采用 XXandOO(麦猪) 的第一种方案来实现,修改我的COM。

谢谢两位!!!!!!!!!
  • 打赏
  • 举报
回复
你试过吗?试过了再说
Err.Raise 就是抛出一个 _com_error , 就是设置 IErrorInfo + return hr. 你不捕获异常当然异常退出了.
jinliu 2004-11-12
  • 打赏
  • 举报
回复
Err.Raise后,VB应用程序就异常退出了,如何得行?
XXandOO 2004-11-12
  • 打赏
  • 举报
回复
白写这么多,看没看呀,S_OK后调用GetErrorInfo函数检查和清除异常!
  • 打赏
  • 举报
回复
Err.Raise 就可以了.
jinliu 2004-11-12
  • 打赏
  • 举报
回复
DiabloWalkOnTheEarth(毁灭小符 (Annihilus)你好
你说的意思是下面这样吗,但返回的HRESULT仍然是0(S_OK)

Private Sub BoxEvents_OnQueryMinData(ByVal iPort As Long, ByVal cKeyIndex As Long,)
Label3.Caption = "1111"
On Error GoTo ErrHandle
Err.Raise vbObjectError + 513
ErrHandle:
Exit Sub
End Sub
XXandOO 2004-11-12
  • 打赏
  • 举报
回复
COM DLL得到的HResult是VB运行时库返回的,所以只能返回VB运行时错误,如果要返回自定义错误,可以更改事件接口函数:
HRESULT OnQueryMinData([in]int iPort,[in]int cKeyIndex,[out,retval]int iReturn);
对应的VB函数:
Function int BoxEvents_OnQueryMinData(ByVal iPort As Long, ByVal cKeyIndex As Long)

也可以像上边说的在VB函数中Err.Raise,但COM DLL中要在VB回调函数调用S_OK后,使用GetErrorInfo函数检查和清除自定义异常,否则,VB主调用函数将得到这个异常。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧