首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-09-24 
CAxWindow接口CreateControl()有时候返回“类别已存在”错误,是什么原因?我要在自己的程序里嵌入Windows Med

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

热点排行