WMP EventDispatcher: как узнать, кто отправил событие?

Я встраиваю Windows Media Player в C-программу. Я нашел пример хоста WMP в C ++ в WMP SDK. Содержит даже диспетчер. Но когда я получаю событие, как я узнаю, кто послал событие, и как я могу получить доступ к переменным этого класса? Например, я хочу установить член класса (переменную) или вызвать метод.

Объект 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

Решение

РЕДАКТИРОВАТЬ: Мое улучшенное решение, которое отвечает моим потребностям:

Сначала я распутал зависимости включения и применил защиту от циклических включений. CWMPHost учебный класс определение не нужно знать о CWMPEventDispatch учебный класс; Однако его реализация делает, поэтому CWMPEventDispatch.h определение класса включено в CWMPHost.cpp файл, но не в CWMPHost.h файл.

Это позволяет определить члена CWMPEventDispatch быть указателем на владельца CWMPHost объект:

    CWMPHost *pCWMPHost;

Это установлено в CWMPHost::Create метод:

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

Теперь диспетчер событий может получить доступ к методам и членам CWMPHost объект, который создал диспетчер.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]