COM的问题

ufo_yang 2010-09-21 11:08:02
有这样一个应用, 主应用程序会用到MS的xml 控件, 所以需要调用Coinitialize()初始化COM控件的运行环境,但是有一线程会用到其他的COM组件,所以线程初始化的时候,也要调用Coinitialize()函数, 程序提供终止线程的操作, 若线程被终止会调用::CoUninitialize();清除掉线程的运行环境; 但问题来了,多运行、终止几次线程, 做如下操作会有问题: 某些情况下要释放掉m_pXMLDomDoc指针(因需要加载另一个xml文件),此时再用函数:
HRESULT hr = CoCreateInstance( __uuidof(DOMDocument40),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(MSXML2::IXMLDOMDocument),
(void**)&m_pXMLDomDoc);
创建m_pXMLDomDoc对象的时候, 会出现问题, 返回的错误码hr为:0x800401f0, 这样看帮助文档应该是CO_E_NOTINITIALIZED的意思;但是我的主应用程序是没有调用函数::CoUninitialize();的, 线程的函数调用Coinitialize()和CoUninitialize()是匹配的, 为什么会出现这种情况????
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ufo_yang 2010-09-25
  • 打赏
  • 举报
回复
继续顶一下
jameshooo 2010-09-21
  • 打赏
  • 举报
回复
怎么确保匹配的?
ufo_yang 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jameshooo 的回复:]
原来是MFC程序啊,MFC中应该用AfxOleInit()初始化,无需清理,所以不要调用CoInitialize/CoUninitialize
[/Quote]
现在好像问题解决了, 什么原因呢? 能指点一下吗?
ufo_yang 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jameshooo 的回复:]
原来是MFC程序啊,MFC中应该用AfxOleInit()初始化,无需清理,所以不要调用CoInitialize/CoUninitialize
[/Quote]
主应用程序进程和线程里面都调用AfxOleInit()来初始化吗?
jameshooo 2010-09-21
  • 打赏
  • 举报
回复
原来是MFC程序啊,MFC中应该用AfxOleInit()初始化,无需清理,所以不要调用CoInitialize/CoUninitialize
ufo_yang 2010-09-21
  • 打赏
  • 举报
回复
还有一点说明一下, 我的处理XML的代码封装到了一个类里面了, 线程里面也会用到这个类, 类变量是作为全局变量的, 主应用程序和线程都可以使用, 会是这里的原因造成的吗?
ufo_yang 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jameshooo 的回复:]
怎么确保匹配的?
[/Quote]
线程启动初始化的时候,创建运行环境, 退出的时候会先调用线程的一个ExitInstance函数,里面会释放掉COM运行环境的。 最后才强行终止线程;

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧