C ++ - 从控制台应用程序运行Windows Media Player - COM

时间:2014-08-16 06:33:16

标签: c++ windows-7 com windows-media-player

我正在尝试使用Windows Media Player播放电影,稍后将添加一些其他功能。 以下是我写的代码:

const CLSID CLSID_WindowsMediaPlayer = {0x6BF52A52, 0x394A, 0x11d3, {0xB1, 0x53, 0x00, 0xC0, 0x4F, 0x79, 0xFA, 0xA6 } };
HRESULT         hr;
IWMPPlayer      *pMediaPlayer = NULL;

hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if(FAILED(hr))
{
    std::cout << "ERR -- Could not Initialize COM engine for you" << std::endl;
    return 0;
}

hr = CoCreateInstance(CLSID_WindowsMediaPlayer, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pMediaPlayer);
if(FAILED(hr))
{
    std::cout << "ERR - Could not get WMPPlayer Interface Pointer" << std::endl;
    return 0;
}
std::cout << "Got MediaPlayer Pointer" << std::endl;

IWMPSettings    *pMediaPlayerSettings = NULL;
hr = pMediaPlayer->get_settings(&pMediaPlayerSettings);
if(FAILED(hr))
{
    std::cout << "ERR - Could not get WMPSettings Interface Pointer" << std::endl;
    ReleaseInterfaces((IUnknown**)&pMediaPlayer);
    return 0;
}
std::cout << "Got MediaPlayerSettings Pointer" << std::endl;

hr = pMediaPlayerSettings->put_autoStart(VARIANT_TRUE);
if(FAILED(hr))
{
    std::cout << "ERR - Could not put auto_start to true" << std::endl;
    ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
    ReleaseInterfaces((IUnknown**)&pMediaPlayer);
    return 0;
}
std::cout << "Have put it to autostart" << std::endl;

hr = pMediaPlayerSettings->put_volume(50);
if(FAILED(hr))
{
    std::cout << "ERR - Could not put volume" << std::endl;
    ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
    ReleaseInterfaces((IUnknown**)&pMediaPlayer);
    return 0;
}
std::cout << "Have put volume to listen-able" << std::endl;

hr = pMediaPlayer->put_URL(L"C:\\background.mp3");
if(FAILED(hr))
{
    std::cout << "ERR - Could not set URL" << std::endl;
    ReleaseInterfaces((IUnknown**)&pMediaPlayerSettings);
    ReleaseInterfaces((IUnknown**)&pMediaPlayer);
    return 0;
}
std::cout << "Have set URL" << std::endl;

到目前为止一切都很好。但文件从未播放过。经过进一步调查,我发现WMPPlayState永远不会成为wmppsPlaying,所以我测试了是否使用WMPOpenState打开了文件,但我总是得到wmposOpeningUnknownURL。我首先想到这可能是因为我将文件放在C:中,这需要管理员权限,但使用其他位置也会产生相同的结果。我已经检查了我使用put_URL设置的网址是否实际放置,是的,get_URL会给出我的设置网址。我还测试了不同的文件和格式。

此外,Windows Media Player未打开!

2 个答案:

答案 0 :(得分:4)

  hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

这是一个非常常见的选择。我们无法看到您的其他代码,但鞋子适合。它要求您执行其他对STA线程的硬性要求。你必须抽一个message loop。如果不这样做会导致各种问题,死锁并不少见。是的,状态不会发生变化,WMP内部的工作线程与您的公寓线程之间的信号发生变化是因为您没有泵送。

您在GUI应用程序中获得了一个消息循环,例如选择Win32 Project项目模板,而不是Win32控制台应用程序模板。或者添加代码,样板是:

MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

要注意你没有窗口,你要求CLSCTX_INPROC_SERVER。换句话说,WMP在程序内部运行。获取窗口需要使用ActiveX托管,而不是在没有像MFC或Winforms这样的类库的重要帮助下通常要解决的问题。也许你真正打算做的是在进程外运行它以便它可以显示自己的窗口?

答案 1 :(得分:3)

您可以直接使用更易于使用的IWMPPlayer4界面,如下所示:

IWMPPlayer4 *pMediaPlayer;

CoCreateInstance(CLSID_WindowsMediaPlayer, NULL, CLSCTX_ALL, IID_IWMPPlayer4, (void**)&pMediaPlayer);
pMediaPlayer->openPlayer(_bstr_t(L"C:\\background.mp3"));