我担心这可能是一个深奥的,但经过一番搜索后,我想知道是否有其他人遇到过这个问题?问题是当调用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
答案 0 :(得分:2)
我遇到了一个对DirectShow的引用,改变了某些接口的实现,使用IntPtr
代替Int
进行64位支持:
http://directshownet.sourceforge.net/
我们还纠正了与64位支持相关的问题。主要修复结构上的“打包”问题,但是一些接口已经改为支持64位。主要将参数从int更改为IntPtr。这将需要在您使用它们的地方进行代码更改,但更改相对明显,并且可以通过重新编译轻松找到。
确实:
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位。