Forum: PC-Programmierung Frage zu Mediaplayer und COM


von TheMason (Gast)


Lesenswert?

Hallo Leute,

da ich schon in einigen anderen Foren (CodeProject.com und
c-plusplus.de) nach einer Lösung für mein Problem gesucht (und gefragt)
habe, und leider noch keine passende Antwort gefunden habe hoffe ich das
mir hier vielleicht jemand helfen kann (wenn mir denn noch zu helfen
ist).

Und zwar :

Ich möchte über die COM-Schnittstelle erkennen ob der Windows Media
Player gestartet worden ist. COM deshalb da ich im zweiten Schritt mich
auf den Player connecten möchte, um dann Infos wie Titel, Spieldauer
usw. zu ermitteln.
Die Funktion mit der man erkennen kann ob Progamme mit
COM-Schnittstellen gestartet worden sind heißt GetActiveObject.
Das ganze Funktioniert auch Klasse mit Word und Excel. Nur der blöde
Media-Player will nicht und ich habe nicht den dunstesten Schimmer
einer blassen Ahnung warum das nicht klappen will. Ich habe es mit dem
Mplayer2.exe (bei Win2K std-mässig dabei), wie mit dem Windows Media
Player 9 bzw. 10 ausprobiert. Was es nicht sein kann sind falsche
CLSIDs oder ProgIDs, denn die habe ich aus der Registry.
Ein paar Side-Infos : Ich nutze VS 2003 .NET auf Win2k.
Was ich nicht möchte ist : Einen anderen Player nutzen müssen (Vorgabe)
und ich möchte kein Plugin schreiben müssen das im Media-Player laufen
muß um mir die Infos rauszuspucken.

Wie gesagt geht es mir nur darum das ich die Info haben will :
Mediaplayer läuft/läuft nicht und einen Pointer auf eine Klasse mit der
ich den Player ansteuern kann (aber den bekommt man automatisch mit
GetActiveObject).

Hat vielleicht jemand eine Idee ?!

Gruß
Rene

von René K. (king)


Lesenswert?

> Die Funktion mit der man erkennen kann ob Progamme mit
> COM-Schnittstellen gestartet worden sind heißt GetActiveObject.

Das ist ein Irrtum. Mit GetActiveObject bekommst Du nur dir Objekte,
die zuvor von der Anwenung selbst per RegisterActiveObject oder
IRunningObjectTable::Register in die ROT eingetragen wurden. Bleibt das
aus, funktioniert GetActiveObject eben nicht, völlig unabhängig der
aktuell gestarteten OutOfProcess Server. Beim IE geht das übrigens auch
nicht mehr, irgendein SP hat das mal unterbunden.

Was den Player betrifft, gibt es keine dokumentierten Wege (lies: ist
mir noch nicht untergekommen), das von Dir gewünschte zu erreichen.
Da wirst Du schlechte Karten haben.

Davon mal ab: Der Player startet doch eigentlich sowieso nur einmal.
Damit sollte es doch reichen, einfach CoCreateInstance auf das
AppObject auszuführen. Dann wird Dir zwar ein neues Objekt erstellt,
aber es sollte der bereits laufende Player bedient werden. (<<-- diese
Aussage bitte mit Vorsicht geniessen, ich habe das nicht selbst
probiert).

von TheMason (Gast)


Lesenswert?

@rene

erstmal vielen dank. ist seit tagen mal ne antwort mit der man was
anfangen kann. bin selbst noch nicht so tief in c++ und com drin.

mit dem rot leuchtet ein. nach dem motto : wenn sich eine app nicht in
der ROT registriert, kann man diese von außen nicht finden.
mit dem IE habe ich gerade auch herausgefunden. beim imaging ist es
dasselbe verhalten.
zum media player sag ich nur sch..........aade.. verdammt
sch......ade.
ich habe in dem codeproject.com forum die antwort erhalten das ich es
mal mit hooks probieren sollte. aber hooks dürften ungleich
komplizierter sein als COM und nicht versionsfest.
find ich ja echt toll das die den media-player als
super-duper-tolle-wurst dahinstellen und dann noch nichtmal die
einfachsten sachen möglich sind (ich weiß schon warum mir persönlich
der winamp lieber ist).
zum thema "mediaplayer nur einmal starten" eine kleine info an dich
zurück :
ich habe es ausprobiert (hatte auch gedacht das es so gehen würde, aber
es dudeln dann 2 media-player, einmal der manuell gestartete und der
über COM instanziierte)
also langsam weiß ich echt nicht mehr weiter (vielleicht weils wirklich
nicht weiter geht :-x)

gruß

rene

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.