Vb.net 64位上的DirectShowLib IMediaEventEx.GetEvent返回0

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”消息,该消息在视频文

我担心这可能是一个深奥的问题,但经过一些搜索后,我想知道是否有其他人遇到过这个问题?问题在于,调用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-代码

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