DirectShowLib IMediaEventEx.GetEvent在64位上返回0

时间:2012-04-12 16:18:58

标签: vb.net directshow directshow.net

我担心这可能是一个深奥的,但经过一番搜索后,我想知道是否有其他人遇到过这个问题?问题是当调用IMediaEventEx.GetEvent方法时,' EventCode'在64位计算机上运行时,参数始终返回0。相同的代码和类似的环境,但在32位机器上工作正常。

这种方法是在熟悉的HandleGraphEvent'通过捕获适当的WM_GRAPHNOTIFY消息调用的方法。更具体地说,我正在寻找' DirectShowLib.EventCode.Complete'视频文件完成时调用的消息。如上所述,在32位系统(正在运行)上,它会生成事件代码/消息' ClockChanged'' Paused'最后是'完成'以该顺序。在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

1 个答案:

答案 0 :(得分:2)

我遇到了一个对DirectShow的引用,改变了某些接口的实现,使用IntPtr代替Int进行64位支持:

  

http://directshownet.sourceforge.net/

     

我们还纠正了与64位支持相关的问题。主要修复结构上的“打包”问题,但是一些接口已经改为支持64位。主要将参数从int更改为IntPtr。这将需要在您使用它们的地方进行代码更改,但更改相对明显,并且可以通过重新编译轻松找到。

确实:

  

MSDN

HRESULT GetEvent(
  [out]  long *lEventCode,
  [out]  LONG_PTR *lParam1,
  [out]  LONG_PTR *lParam2,
  [in]   long msTimeout
);

所以也许:

Dim evParam1, evParam2 As IntPtr

我认为你的EventCode类型也需要作为IntPtr传递(除非这已经是它的类型)。即使在为x64编译时,Integer类型仍然是32位数(因为Short类型等仍然可用于32位应用程序)。但是,64位应用程序的指针都是64位数量,因此传递32位Integer将不起作用。 IntPtr结构取决于平台 - x86为32位,x64为64位。