Я встраиваю 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
РЕДАКТИРОВАТЬ: Мое улучшенное решение, которое отвечает моим потребностям:
Сначала я распутал зависимости включения и применил защиту от циклических включений. CWMPHost
учебный класс определение не нужно знать о CWMPEventDispatch
учебный класс; Однако его реализация делает, поэтому CWMPEventDispatch.h
определение класса включено в CWMPHost.cpp
файл, но не в CWMPHost.h
файл.
Это позволяет определить члена CWMPEventDispatch
быть указателем на владельца CWMPHost
объект:
CWMPHost *pCWMPHost;
Это установлено в CWMPHost::Create
метод:
hr = CComWMPEventDispatch::CreateInstance(&pEventListener);
pEventListener->pCWMPHost= this;
Теперь диспетчер событий может получить доступ к методам и членам CWMPHost
объект, который создал диспетчер.
Других решений пока нет …