我将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
找到完整的示例代码答案 0 :(得分:0)
编辑:我改进的解决方案满足了我的需求:
首先,我解开了包含依赖关系并应用了包含针对循环包含的保护。 CWMPHost
类定义不需要了解CWMPEventDispatch
类;但它的实现确实如此,因此CWMPEventDispatch.h
类定义包含在CWMPHost.cpp
文件中,但不包含在CWMPHost.h
文件中。
这允许将CWMPEventDispatch
的成员定义为指向拥有CWMPHost
对象的指针:
CWMPHost *pCWMPHost;
它是在CWMPHost::Create
方法中设置的:
hr = CComWMPEventDispatch::CreateInstance(&pEventListener);
pEventListener->pCWMPHost= this;
现在事件调度程序可以访问创建调度程序的CWMPHost
对象的方法和成员。