gpt4 book ai didi

c++ - 尝试在 CAxWindow 中托管 WMP 时,IAxWinHostWindow CreateControl 返回 E_NOINTERFACE

转载 作者:可可西里 更新时间:2023-11-01 10:36:45 33 4
gpt4 key购买 nike

我正在尝试在我的 Win32 应用程序中嵌入一个 WMP 控件。我在这里遵循了示例代码:Hosting the Windows Media Player Control in a Windows Application

但是,当我单步执行这个示例时,该行:

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);

如果有人能进一步阐明这一点,那就太好了。

Edit2:刚刚注意到我在单步执行这段代码时在输出窗口中收到垃圾邮件:

无法进行传出调用,因为应用程序正在调度输入同步调用”有什么想法吗?

最佳答案

代码是正确的,可以按原样工作,并且按照 MSDN 页面上的建议。

如果您的 UI 窗口位于 MTA 单元中,则可能会出现与描述完全相同的问题,即您正在运行的线程是使用 CoInitializeEx(NULL, COINIT_MULTITHREADED) 初始化的。

接下来会发生什么,您的 WMP 在侧 STA 线程上实例化,其接口(interface)编码到您的线程/单元中。并不是每个必需的接口(interface)都可以通过这种方式传输,所以一旦你继续初始化它,一些必需的接口(interface)就会丢失......

WMP 使用“单元”线程模型,在 STA 线程上使用它。

关于c++ - 尝试在 CAxWindow 中托管 WMP 时,IAxWinHostWindow CreateControl 返回 E_NOINTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21699887/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com