当试图在CAxWindow中承载WMP时,IAxWinHostWindow CreateControl返回E_NOINTERFACE

我想在我的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线程上使用它。