COM zum WindowsMediaPlayer

  • Nach längerer Abstinenz - letztes Projekt war "Ich/Wir baue(n) mir/uns ein CAD" - habe ich nun was Neues auf dem Tisch: Mediathek.
    Um Videos (mpg-Dateien) auf dem PC wiedergeben zu können ist es am Einfachsten den bordeigenen MediaPlayer von Windows (WMP) zu benutzen - dachte ich jedenfalls zunächst.
    Ähnlich wie bei EXCEL, oder auch TurboCAD sollte es doch auch beim WMP über die COM-Schnittstellen-DLL "wmp.dll" gehen. Die über 10MB grosse Datei läßt sich in einem COM-Browser auf vorhandene Klassen, Methoden, Eigenschaften und Ereignisse untersuchen. Leider kommen auf unterschiedlichen COM-Browsern auch unterschiedliche Ergebnisse. Ich habe es versucht mit:
    - PowerBasic-COM Browser
    - comTL-Browser von Holger Schwichtenberg
    - COM-Browser aus dem VB2005-Studio

    Am Einfachsten und ohne COM geht:
    <Run("C:\Programme\Windows Media Player\wmplayer.exe", "", @SW_MAXIMIZE)/> oder
    <ShellExecuteWait("wmplayer.exe")/> dann sollte noch
    <WinWaitActive("Windows Media Player")/> folgen, sonst gehen die nachfolgenden "Send"-Funktionen nicht:
    <Send("!df")
    Send($Link & "{ENTER}")/>
    In $Link ist Pfad und Datei des Videos enthalten. Das funktioniert auch, aber wie den WMP automatisch schließen, wenn das Video zu Ende ist?
    Auch über:
    <$exitCode = ShellExecuteWait($Link, "")/>
    lässt sich der Status des WMP ("Play" oder "Stop") nicht ermitteln, weil es offensichtlich keine Rückgabe-Info gibt.
    <While $exitCode = 0
    WinClose("Windows Media Player", "")
    WEnd/> funktioniert leider nicht so, weil offensichtlich immer $exitCode = 0 ist...

    Ein Ausweg sollte die COM-Technologie sein, aber das Problem fängt dann schon beim COM-Aufruf unter AutoIt an.
    Im COM-Browser wird die wmp.dll mit "WMPLib" bezeichnet. Das versteht die Referenzierung mit
    <$WMPapp = ObjCreate("WMPLib.WindowsMediaPlayer")/> aber nicht, sondern - und diese Info habe ich aus dem PB_COM-Browser - mit diesem Aufruf:
    <$WMPapp = ObjCreate("WMPlayer.OCX")/>
    Zur Überprüfung dann Folgendes:
    <If $WMPapp = -1 Then
    MsgBox (0, "Fehler", "Die COM konnte nicht hergestellt werden")
    Exit
    Else
    MsgBox(0, "Mediaplayer-Status", "Status = " & $WMPapp.PlayState + 1 & " ...." & @CRLF & " läuft, d.h. die COM-Schnittstelle zum Mediaplayer kann jetzt verwendet werden")
    EndIf/>

    Der Start ist dann über
    <$WMPapp.OpenPlayer($Link)/> möglich und geht auch gleich los...
    Anstelle dessen mit:
    <$WMPapp.url = $Link
    $WMPapp.controls.play()
    $WMPapp.controls.stop()/>
    haben keinerlei Auswirkung auf den laufenden WMP. Mit
    <MsgBox(0, "Mediaplayer-Status", "PlayStatus = " & $WMPapp.PlayState)/>
    kann man sich jederzeit den Status anzeigen lassen, auch das hier geht:
    MsgBox(0, "Mediaplayer-Status", "OpenStatus = " & $WMPapp.OpenState())
    MsgBox(0, "Mediaplayer-Status", "WMP-Version = " & $WMPapp.versionInfo())/>
    Vieles Andere dagegen nicht - wie z.B. das wichtige
    <$WMPapp.Close()/> wird ignoriert.
    Der "Play-Status" ist unabhängig vom laufenden WMP, nur von den .controls-Befehlen - die aber, wie schon festgestellt, keine Auswirkungen auf den laufenden WMP haben.
    Ohne den "openPlayer"-Befehl ist kein Video zu sehen!

    Wo ist das Problem, bzw. die Lösung?
    Gehe ich recht in der Annahme, dass sich die "WMPlayer.OCX"-Referenzierung nur auf ein GUI-Control bezieht? -
    <$WMPapp = ObjCreate("MediaPlayer.MediaPlayer.1")/> geht zwar auch, bewirkt aber das Gleiche wie mit "WMPlayer.OCX".
    Eine andere habe ich aber nicht zum Laufen gebracht...

    Wäre eine DLL-Anbindung mit "DLL.Open"/"DLLCall" bei der "wmp.dll" eine Alternative?
    Bin sehr gespannt auf Eure Vorschläge...

    Grüsse aus Berlin

    PSblnkd

    Einmal editiert, zuletzt von PSblnkd (28. Dezember 2014 um 17:51)

  • KloMeister
    Danke für den Hinweis. HomeCinema kenne ich auch - ist sogar noch auf dem PC, aber dessen API ist sicherlich genauso kompliziert wie die vom WMP. Außerdem sollte es mit Windows-Bordmitteln gehen, um nicht weitere Programme installieren zu müsse.

    Mir ging es hier um einen Erfahrungsaustausch mit COM-Wissenden, denn die ganze Thematik ist doch ziemlich nebulös. Habe auch mal versucht im englischen Forum ein bischen über "COM" "rumzulesen", aber so recht schlau geworden bin ich daraus auch nicht.
    Bei einem weiteren Versuch für meine Mediathek PDF-Datein über den AcrobatReader9 zu starten (COM ist "acroRD32.dll") schlugen völlig fehl.
    Obwohl offensichtlich ein Objekt mit:
    <$PDFapp = ObjCreate("AcroExch.Document")/> erzeugt werden kann, ergaben dann weitere Aufrufe: "The requested action with this object has failed."
    Die Objekt-Zuweisung ist offensichtlich je nach der Version des AcrobatReader unterschiedlich, so geht z.B. auch:
    <$PDFapp = ObjCreate("AcroPDF.PDF.1")/> ich weis allerdings nicht, auf welche DLL dann Bezug genommen wird.
    In den Objekt-Browsern sind jede Menge Methoden, Eigenschaften und Ereignisse aufgeführt, die offensichtlich alle in AutoIt nicht unterstützt werden. Mir fehlt hier nach wie vor der Durchblick, wieso das hier nicht funktioniert...

    Ich hoffe immer noch, dass mir das jemand erklären kann, da es doch in MS-Office und sogar in TurboCAD geht.

    Grüsse aus Berlin

    PSblnkd

  • Ich habe noch etwas gefunden, was möglicherweise das COM-Problem bei AutoIt lösen kann:
    Unter http://sourceforge.net/projects/au3automation/ ist ein Skript (UDF) zu finden, was (Google-transl.) "Funktionen für die Veröffentlichung eines AU3-Skript als COM-Server. AutoIt-v3-COM Automation Brücke ermöglicht die Funktionen in AutoIt v3 (AU3) Skripte von WSH, VBasic oder andere COM fähigen Programmiersprachen zu verwenden.
    Die Bibliothek besteht aus zwei Teilen, einem COM Proxy DLL AU3Aut.dll und kleinem UDF AU3Automation.au3."

    Leider ist die kommentierende Beschreibung wieder so dürftig, dass das kein Mensch auf Anhieb versteht. Zwar sind die 6 Funktionen mit ihren Parameter funktionell kurz angerissen, aber ohne Hintergründe und Zusammenhänge zu kennen tappt man da wie im Nebel ...
    Vielleicht kann ja jemand damit was anfangen und macht mich (uns) mal schlau, wie das zu händeln ist.

    In diesem Sinne - kommt gut über den Jahreswechsel und alles Gute für 2015.

    Grüsse aus Berlin

    PSblnkd