2012-04-12 26 views
0

我擔心這可能是一個深奧的,但經過一些搜索後,我想知道是否有其他人遇到過這個問題?問題是,當調用IMediaEventEx.GetEvent方法時,在64位機器上運行時,「EventCode」參數始終返回0。相同的代碼和類似的環境,但在32位機器上工作正常。DirectShowLib 64位返回的IMediaEventEx.GetEvent 0

該方法在通過捕獲適當的WM_GRAPHNOTIFY消息調用的相關的'HandleGraphEvent'方法中被調用。更具體地說,我正在尋找在視頻文件完成時調用的'DirectShowLib.EventCode.Complete'消息。如前所述,在32位系統上(即正在運行),它會按順序生成事件代碼/消息「ClockChanged」,「已暫停」,最後生成「完成」。在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

東西是本着一個錯字'GetEvent(evCode,evParam1,evParam1'。你想第三個參數'evParam2'代替,不是嗎? – 2012-04-12 16:38:43

+0

衛生署,感謝擡起頭來! – SeanCocteau 2012-04-13 09:20:14

回答

2

我碰到一個參考來的DirectShow改變一些接口的執行到位的Int使用IntPtr對於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位。你可能還需要檢查

+0

優秀事實證明,我沒有使用擁有Intptr簽名的2005庫,更改庫和數據類型是一種享受。謝謝! – SeanCocteau 2012-04-13 09:21:20

+0

@SeanCocteau - 很高興幫助! – 2012-04-13 15:46:35