2012-04-12 5 views
0

Ich fürchte, diese vielleicht eine esoterischen ein, aber nach einiger Suche Ich frage mich, ob jemand dieses Problem gestoßen? Das Problem besteht darin, dass beim Aufruf der IMediaEventEx.GetEvent-Methode der Parameter 'EventCode' immer 0 zurückgibt, wenn er auf einer 64-Bit-Maschine ausgeführt wird. Der gleiche Code und ähnliche Umgebung, aber auf einer 32-Bit-Maschine funktioniert gut.DirectShowLib IMediaEventEx.GetEvent auf 64-Bit-Rückkehr 0

Dieses Verfahren wird innerhalb des familar ‚HandleGraphEvent‘ Methode aufgerufen, die von der Erfassung der entsprechenden WM_GRAPHNOTIFY Nachricht aufgerufen wird. Genauer gesagt suche ich nach der 'DirectShowLib.EventCode.Complete'-Nachricht, die aufgerufen wird, wenn eine Videodatei abgeschlossen ist. Wie bereits erwähnt, erzeugt es auf 32-Bit-Systemen (das funktioniert) den Ereigniscode/die Nachricht 'ClockChanged', 'Paused' und schließlich 'Complete' in dieser Reihenfolge. Auf der 64-Bit-Maschine wird die HandleGraphEvent-Methode auch dreimal aufgerufen, aber jedes Mal, wenn GetEvent aufgerufen wird, ist der EventCode 0.

Hat jemand anderes dieses Problem oder Probleme beim Verschieben von DirectShowLib-Code von 32-Bit zu erfahren 64-Bit?

Vielen Dank im Voraus ...

FWIW - der Code ...

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

Etwas, das Sie vielleicht auch überprüfen möchten, ist ein Tippfehler in Zeile 'GetEvent (evCode, evParam1, evParam1'. Sie wollten dritten Argument' evParam2' stattdessen, oder? –

+0

Doh, danke für die Köpfe hoch! – SeanCocteau

Antwort

2

stieß ich auf eine Referenz, die Umsetzung einiger der Schnittstellen zu Directshow Ändern IntPtr anstelle von Int zu verwenden für 64-Bit-Unterstützung:

http://directshownet.sourceforge.net/

Wir haben auch Probleme im Zusammenhang mit 64-Bit-Unterstützung behoben. In erster Linie "Pack" Probleme auf Strukturen zu beheben, aber einige Schnittstellen wurden geändert, um 64 Bit zu unterstützen. Ändert hauptsächlich Parameter von int zu IntPtr. Dies wird Codeänderungen erfordern, wo Sie sie verwenden, aber die Änderungen sind relativ offensichtlich und werden leicht mit einer Neukompilierung gefunden.

Tat:

MSDN

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

So vielleicht:

Dim evParam1, evParam2 As IntPtr 

Ihre EventCode Art auch würde, glaube ich, müssen als IntPtr übergeben werden (es sei denn, das ist schon sein Typ. Der Typ Integer bleibt eine 32-Bit-Nummer, auch wenn er für x64 kompiliert wurde (aus dem gleichen Grund, dass der Typ Short etc. für 32-Bit-Anwendungen verfügbar bleibt). Zeiger für 64-Bit-Anwendungen sind jedoch alle 64-Bit-Größen, so dass die Übergabe eines 32-Bit Integer nicht funktioniert. Die IntPtr Struktur ist plattformabhängig - 32-Bit für x86 und 64-Bit für x64.

+0

Excellent Es stellte sich heraus, dass ich nicht die 2005-Bibliothek verwendete, die die Intptr-Signaturen hatte. Das Ändern der Bibliothek und der Datentypen funktionierte ein Vergnügen. Danke! – SeanCocteau

+0

@SeanCocteau - froh, dass es geholfen hat! –