2016-08-02 23 views
-1

나는 C 프로그램에 Windows Media Player를 내장하려고합니다. WMP SDK의 C++에서 WMP Host 예제를 발견했습니다. 그것은 심지어 디스패처를 포함합니다. 그러나 이벤트를 받으면 누가 이벤트를 보낸지 어떻게 알 수 있습니까? 어떻게 클래스 객체의 변수에 액세스합니까? 예를 들어, 클래스 멤버 (변수)를 설정하거나 메소드를 호출하려고합니다.WMP EventDispatcher : 누가 이벤트를 보냈는지 아는 방법?

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

이벤트를 생성 한 WMP라고 생각하시면됩니다. 아무도 그럴 것이다. –

+0

@ Hans-Passant, 한 명 이상의 플레이어가 활동할 예정이므로 어떤 플레이어인지 알아야합니다. –

답변

0

EDIT에서 찾을 수 있습니다 내 개선 솔루션 내 요구에 부합 :

우선이 포함 포함 종속성을 untangled 및 적용을 순환 포함에 대한 경비원. CWMPHost 클래스 정의CWMPEventDispatch 클래스에 대해 알 필요가 없습니다. 그러나 구현은 수행하므로 CWMPEventDispatch.h 클래스 정의는 CWMPHost.cpp 파일에는 포함되지만 CWMPHost.h 파일에는 포함되지 않습니다.

CWMPHost *pCWMPHost; 

그것은이 CWMPHost::Create 방법 설정 :

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

것은 이제 이벤트 디스패처가 액세스 할 수있는

이 소유하는 CWMPHost 개체에 대한 포인터로 CWMPEventDispatch의 멤버를 정의 할 수 있습니다 디스패처를 작성한 CWMPHost 객체의 메서드 및 멤버