0

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

此方法在通过捕获适当的 WM_GRAPHNOTIFY 消息调用的熟悉的“HandleGraphEvent”方法中被调用。更具体地说,我正在寻找视频文件完成时调用的“DirectShowLib.EventCode.Complete”消息。如前所述,在 32 位系统(正在工作)上,它会按顺序生成事件代码/消息“ClockChanged”、“Paused”,最后是“Complete”。在 64 位机器上,HandleGraphEvent 方法也被调用了 3 次,但每次调用 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
4

1 回答 1

2

我遇到了对 DirectShow 的引用,它更改了一些接口的实现以IntPtr代替Int64 位支持:

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 传递(除非这已经是它的类型)。Integer即使为 x64 编译,该类型仍然是 32 位数字(出于同样的原因,该Short类型等仍然可用于 32 位应用程序)。但是,用于 64 位应用程序的指针都是 64 位量,因此传递 32 位Integer将不起作用。该IntPtr结构取决于平台 - x86 为 32 位,x64 为 64 位。

于 2012-04-12T17:00:49.630 回答