我想在我的Win32应用程序中embedded一个WMP控件。 我已经按照这里的示例代码: 在Windows应用程序中承载Windows媒体播放器控件
但是,当我通过这个例子,行:
hr = spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView, 0);
返回E_NOINTERFACE;
该行:
hr = m_wndView.QueryHost(&spHost);
成功,似乎正确填充spHost。
代码如下:
CAxWindow m_wndView; CComPtr<IObjectWithSite> spHostObject; CComPtr<IAxWinHostWindow> spHost; CComBSTR classID = __uuidof(WindowsMediaPlayer); RECT rcClient = { 0, 0, 560, 335 }; m_wndView.Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE); hr = m_wndView.QueryHost(&spHost); if( SUCCEEDED(hr) ) { hr = spHost->CreateControl(classID, m_wndView, 0); //E_NOINTERFACE } hr = m_wndView.QueryControl(&m_spPlayer); //E_FAIL
有谁能给我任何想法,为什么发生这种情况? 谢谢。
编辑 :实际上失败的行是ActivateAx()函数中的这一行:
hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);
如果任何人都可以在这一点上再阐明这将是伟大的。
编辑2 :只是注意到我得到这个垃圾邮件在我的输出窗口,而我正在通过这段代码:
“ 由于应用程序正在调度一个input同步调用,所以不能进行呼出 ”Any Ideas?
代码是正确的,并按照原样,并在MSDN页面上建议。
如果您的UI窗口位于MTA公寓,那么您正在运行的线程已使用CoInitializeEx(NULL, COINIT_MULTITHREADED)
初始化。
接下来发生的事情是,你的WMP被实例化在一个侧面的STA线程上,并将其接口封装到你的线程/公寓中。 并不是每个必需的接口都可以通过这种方式传输,所以一旦你继续初始化它,一些强制接口就会丢失。
WMP使用“Apartment”线程模型,在STA线程上使用它。