WMP EventDispatcher:如何知道谁发送了这个事件?

时间:2016-08-02 14:46:06

标签: c++ windows-media-player wmp

我将Windows Media Player嵌入到C程序中。我在WMP SDK中找到了C ++中的WMP主机示例。它包含一个偶数调度程序。但是当我收到一个事件时,我如何知道谁发送了该事件以及如何访问该类对象的变量?例如,我想设置一个类成员(变量)或调用方法。

CWMPHost对象创建包含WMP对象的窗口并创建事件对象。最小的代码是:

LRESULT CWMPHost::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    AtlAxWinInit();
    CComPtr<IAxWinHostWindow>           spHost;
    CComPtr<IConnectionPointContainer>  spConnectionContainer;
    CComWMPEventDispatch                *pEventListener = NULL;
    CComPtr<IWMPEvents>                 spEventListener;
    HRESULT                             hr;
    RECT                                rcClient;

    m_dwAdviseCookie = 0;

    // create window
    GetClientRect(&rcClient);
    m_wndView.Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0);

    // load OCX in window
    hr = m_wndView.QueryHost(&spHost);
    hr = spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView, 0);
    hr = m_wndView.QueryControl(&m_spWMPPlayer);

    // start listening to events
    hr = CComWMPEventDispatch::CreateInstance(&pEventListener);
    spEventListener = pEventListener;

    hr = m_spWMPPlayer->QueryInterface(&spConnectionContainer);

    // See if OCX supports the IWMPEvents interface
    hr = spConnectionContainer->FindConnectionPoint(__uuidof(IWMPEvents), &m_spConnectionPoint);
    if (FAILED(hr))
    {
        // If not, try the _WMPOCXEvents interface, which will use IDispatch
        hr = spConnectionContainer->FindConnectionPoint(__uuidof(_WMPOCXEvents), &m_spConnectionPoint);
    }
    hr = m_spConnectionPoint->Advise(spEventListener, &m_dwAdviseCookie);

    return 0;
}

可以在https://github.com/pauldotknopf/WindowsSDK7-Samples/tree/master/multimedia/WMP/cpp/WMPHost

找到完整的示例代码

1 个答案:

答案 0 :(得分:0)

编辑:我改进的解决方案满足了我的需求:

首先,我解开了包含依赖关系并应用了包含针对循环包含的保护。 CWMPHost定义不需要了解CWMPEventDispatch类;但它的实现确实如此,因此CWMPEventDispatch.h类定义包含在CWMPHost.cpp文件中,但不包含在CWMPHost.h文件中。

这允许将CWMPEventDispatch的成员定义为指向拥有CWMPHost对象的指针:

    CWMPHost *pCWMPHost;

它是在CWMPHost::Create方法中设置的:

    hr = CComWMPEventDispatch::CreateInstance(&pEventListener);
    pEventListener->pCWMPHost= this;

现在事件调度程序可以访问创建调度程序的CWMPHost对象的方法和成员。