CAxWindow接口CreateControl()有时候返回“类别已存在”错误,是什么原因?


我要在自己的程序里嵌入Windows Media Player播放控件,操作方法如下:
在父窗口上创建CAxWindow类型子窗口,然后在子窗口上创建Windows Media Player控件,代码如下
    CAxWindow m_wndView;
    CComPtr<IAxWinHostWindow> spHost;
    HRESULT hr;
    m_wndView.Create( hWndParent, rect, NULL, dwStyle | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN);
    hr = m_wndView.QueryHost(&spHost);
    if (FAILMSG(hr))
        goto FAILURE;
    hr = spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView.m_hWnd, 0);
    if (FAILMSG(hr))    // 有时候返回错误0x80070582,“类别已存在”
        goto FAILURE;
    ......
第一执行总是成功的,但是关闭窗口后再次进入时,有时候CreateControl()就会返回“类别已存在”错误,经过断点调试确定在关闭父窗口时已经调用了m_wndView的Close()函数。请问这是怎么回事呢?以上代码是按照WMP SDK里的示例代码修改的,对ATL和COM还不是很熟。恳请大家指教。谢谢!

6 个解决方案

#1


都没人来看看啊,这问题卡了好久了一直不能提交,谁有空帮忙看看啊

#2


HWND hWnd = m_wndView.Create( hWndParent, rect, NULL, dwStyle  ¦ WS_CHILD  ¦ WS_VISIBLE  ¦ WS_CLIPCHILDREN); 
这个成功了吗?
检查 hWnd .

#3


确保父窗口销毁时要调用m_wndView.DestroyWindow(),如果外部保存了播放控件的接口指针,要首先Release

#4


谢谢greenabc的热心回答,前面的步骤我都检查过了,每一步都成功了的。我怀疑是不是关闭窗口的时候有资源没有释放呢?

#5


这么几天了,别沉啊!

#6


后来这个问题有解决了么。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com