Grundlegende Wiedergabe mit programmgesteuert erstelltem Windows Media Player

ich versuchte zu"einfach schnell integrieren" der Windows Media Player über COM zum Abspielen einzelner Dateien aus dem lokalen Dateisystem oder von http-Quellen - aber aufgrund der spärlichen Dokumentation und der Online-Ressourcen, die beim Einbetten in einen Ole-Container nicht zur Verfügung stehen, konnte ich das nicht als trivial bezeichnen Use-Case zu arbeiten.

Initialisierung usw. funktioniert einwandfrei, aber tatsächlich schlägt die Wiedergabe einiger Dateien immer fehl.

Beispielcode, beginnend mit der Initialisierung (Fehlerbehandlung entfernt, im Grunde aus dem Englischen übersetzt)C # -Beispiel bei MSDN, ausgeführt auf dem Hauptthread):

CComPtr<IWMPPlayer> player;
player.CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER);
CComQIPtr<IWMPCore3> core(player);
CComPtr<IWMPControls> controls;
core->get_controls(&controls);
CComPtr<IWMPPlaylist> playlist;
core->get_currentPlaylist(&playlist);
CComBSTR path("c:\\bar.mp3"); // alternatively http://foo/bar.mp3

Der erste Ansatz, etwas zu spielen, gibt"Befehl nicht verfügbar":

core->put_url(path);
// ... waiting after that for WMP to load doesn't make a difference
controls->play(); // returns 0x000D1105 - NS_S_WMPCORE_COMMAND_NOT_AVAILABLE

Der zweite Ansatz erzeugt nurS_OKs, aber es wird eigentlich nichts gespielt:

CComPtr<IWMPMedia> media;
core->newMedia(path, &media);
playlist->appendItem(media);
controls->playItem(media); // returns S_OK, but doesn't play

Eine andere Sache, die ich bemerkt habe, ist diecore->get_playState() kehrt immer zurückwmposMediaOpeningegal wie lange ich warte

Ich bin auf einen Thread gestoßen, der darauf hindeutet, dass Multithreading mit WMP möglicherweise nicht ordnungsgemäß funktioniert, und dieser Code wird in einem Apartment mit mehreren Threads ausgeführt. Könnte das das Problem sein?
Wenn nicht, was könnte WMP sonst daran hindern, die Dateien abzuspielen?

Bemerkenswerter Hintergrund:
Die WMP-Instanz wird in einer DLL mit einem Browser als Host-Prozess erstellt.

Aktualisieren:
Beim Versuch, DirectShow zu verwenden, das von WMP selbst verwendet werden soll, tritt ein spezifischeres Problem auf - sieheFrage dafür.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage