Vb.net 64位上的DirectShowLib IMediaEventEx.GetEvent返回0
我担心这可能是一个深奥的问题,但经过一些搜索后,我想知道是否有其他人遇到过这个问题?问题在于,调用IMediaEventEx.GetEvent方法时,“EventCode”参数在64位计算机上运行时始终返回0。相同的代码和类似的环境,但在32位机器上运行良好 此方法在familar“HandleGraphEvent”方法中调用,该方法通过捕获适当的WM_GRAPHNOTIFY消息来调用。更具体地说,我正在查找“DirectShowLib.EventCode.Complete”消息,该消息在视频文件完成时调用。如前所述,在32位系统(正在工作)上,它会按顺序生成事件代码/消息“ClockChanged”、“Paused”,最后生成“Complete”。在64位机器上,HandleGraphEvent方法也会被调用三次,但每次调用GetEvent时,EventCode都是0 是否有其他人在将DirectShowLib代码从32位移动到64位时遇到过此问题 先谢谢你 FWIW-代码Vb.net 64位上的DirectShowLib IMediaEventEx.GetEvent返回0,vb.net,directshow,directshow.net,Vb.net,Directshow,Directshow.net,我担心这可能是一个深奥的问题,但经过一些搜索后,我想知道是否有其他人遇到过这个问题?问题在于,调用IMediaEventEx.GetEvent方法时,“EventCode”参数在64位计算机上运行时始终返回0。相同的代码和类似的环境,但在32位机器上运行良好 此方法在familar“HandleGraphEvent”方法中调用,该方法通过捕获适当的WM_GRAPHNOTIFY消息来调用。更具体地说,我正在查找“DirectShowLib.EventCode.Complete”消息,该消息在视频文
Private Sub HandleGraphEvent()
' This routine handles are notified events from DShow library
Dim hr As Integer
Dim evCode As EventCode
Dim evParam1, evParam2 As Integer
If Me.m_MediaEventEx Is Nothing Then Exit Sub
' Process all the events
While (Me.m_MediaEventEx.GetEvent(evCode, evParam1, evParam1, 0) = 0)
' Cleanup parameters before processing
hr = Me.m_MediaEventEx.FreeEventParams(evCode, evParam1, evParam2)
IsDShowError(hr, "HandleGraphEvent")
' Is this the end of the movie?
If evCode = EventCode.Complete Then
' Is there a movie control availalbe?
If Me.m_MediaControl Is Nothing Or Me.m_MediaSeek Is Nothing Then Return
' Perform Stop Start
hr = Me.m_MediaControl.Stop()
PlayMovie(MoveToNextVideo())
Exit While
End If
End While
End Sub
我遇到一个关于DirectShow的参考,它将一些接口的实现更改为使用
IntPtr
代替Int
来实现64位支持:
我们还纠正了与64位支持相关的问题。主要修复结构上的“包”问题,但一些接口已更改为支持64位。主要是将参数从int更改为IntPtr。这需要在使用它们的地方进行代码更改,但是更改相对明显,并且可以通过重新编译轻松定位
事实上:
所以也许:
Dim evParam1, evParam2 As IntPtr
我认为,您的
EventCode
类型也需要作为IntPtr传递(除非这已经是它的类型)。即使在为x64编译时,Integer
类型仍然是32位数字(原因与Short
类型等仍然适用于32位应用程序相同)。但是,64位应用程序的指针都是64位量,因此传递32位整数将不起作用。IntPtr
结构依赖于平台—x86为32位,x64为64位。您可能还需要检查的是GetEvent行中的输入错误(evCode,evParam1,evParam1
。你想要第三个参数evParam2
,不是吗?多谢提醒!非常棒的东西,原来我没有使用带有Intptr签名的2005库。更改库和数据类型非常有效。谢谢!@SeanCocteau-很高兴它有帮助!
Dim evParam1, evParam2 As IntPtr