读书人

CAxWindow接口CreateControl()有时候返

发布时间: 2012-09-24 13:49:41 作者: rapoo

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还不是很熟。恳请大家指教。谢谢!

[解决办法]
HWND hWnd = m_wndView.Create( hWndParent, rect, NULL, dwStyle ¦ WS_CHILD ¦ WS_VISIBLE ¦ WS_CLIPCHILDREN);
这个成功了吗?
检查 hWnd .
[解决办法]
确保父窗口销毁时要调用m_wndView.DestroyWindow(),如果外部保存了播放控件的接口指针,要首先Release

读书人网 >VC/MFC

热点推荐