podstawowe odtwarzanie z programowo utworzonym Windows Media Player

Próbowałem„po prostu szybko się zintegruj” Windows Media Player za pośrednictwem COM, aby odtwarzać pojedyncze pliki z lokalnego systemu plików lub źródeł http - ale ze względu na rzadką dokumentację i zasoby online do wykorzystania, gdy nie są osadzone w jakimś kontenerze Ole, nie mogłem uzyskać tego rzekomo trywialnego przypadek użycia do pracy.

Inicjalizacja itp. Działa prawidłowo, ale odtwarzanie niektórych plików zawsze kończy się niepowodzeniem.

Przykładowy kod, zaczynając od inicjalizacji (obsługa błędów została usunięta, zasadniczo przetłumaczona zPrzykład C # w MSDN, wykonane w głównym wątku):

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

Pierwsze podejście do gry daje coś„polecenie niedostępne”:

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

Drugie podejście wytwarza tylkoS_OKs, ale tak naprawdę nic nie jest grane:

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

Inną rzeczą, którą zauważyłem jest tocore->get_playState() zawsze wracawmposMediaOpening, nie ważne jak długo będę czekać.

Natknąłem się na jeden wątek, który sugeruje, że wielowątkowość może nie działać poprawnie z WMP i ten kod działa w mieszkaniu wielowątkowym. Czy to może być problem?
Jeśli nie, co jeszcze może uniemożliwić WMP odtwarzanie plików?

Godne uwagi tło:
Instancja WMP jest tworzona w bibliotece DLL z przeglądarką jako procesem hosta.

Aktualizacja:
Wypróbowanie zwykłego DirectShow, z którego WMP powinien korzystać sam, wykazuje bardziej specyficzny problem - patrzpytanie o to.

questionAnswers(2)

yourAnswerToTheQuestion