• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 第二个线程第二次使用CoCreateInstance创建出错

第二个线程第二次使用CoCreateInstance创建出错

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了cocreateinstance,cocreateinstance失败,cocreateinstanceex,c cocreateinstance,cocreateinstance函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 第二个线程第二次使用CoCreateInstance创建出错
描述:

线程函数A(),使用CreateThread 创建多个A()线程
在A线程中调用了一个自定义组件ocx的一个方法,该方法使用CoCreateInstance创建一个com对象
创建的第一个线程执行该方法多次均正常,但创建的第二个线程执行同样的操作CoCreateInstance时会报错,请高手指点,


解决方案1:

你第一个创建的线程可能为主线程吧,COM组件的主线程 使用没有问题
但在自由线程里可能就会有问题,初始化COM环境的时候用CoInilizeEx(........)
在自由线程里没有隐藏的窗口,既没有消息 循环,所以肯定和不一样,我只知道这么多

解决方案2:


  在线程中都初始化COM环境看看。

解决方案3:

对,每个线程都要CoInitialize(Ex) !

解决方案4:

在新的线程中也需要初始化COM,参考:
http://www.vckbase.com/document/viewdoc/?id=1183
引:
 总是调用 CoInitialize(Ex) 
  几个月前,我收到了一封朋友的电子邮件,他就职于一家著名的硬件公司。他的公司编写了一个非常复杂的基于 COM 的应用程序,其中使用了许多进程内和本地(进程外)的 COM 组件。在开始时,应用程序创建了 COM 对象以服务于运行在多线程单元 (MTA) 中的各种客户端线程。该对象还可以托管给 MTA,这意味着接口指针可以在客户端线程之间自由交换。在测试中,我的朋友发现在应用程序准备关闭之前,一切都进行得不错。然后,不知是什么原因,对 Release 的调用(必须执行此调用,以便正确释放客户端占用的接口指针)被锁定了。他的问题是:“到底是哪里出了问题?” 
  其实答案非常简单。应用程序的开发人员其他都做得很对,只有一点例外,而这点又非常重要:他们没有在所有的客户端线程中调用 CoInitialize 或 CoInitializeEx。现代 COM 的基本原则之一,就是每个使用 COM 的线程都应该先调用 CoInitialize 或 CoInitializeEx 来初始化 COM。这条原则是无法免除的。除了其他事情以外,CoInitialize(Ex) 应将线程放入单元中,并初始化重要的每线程状态信息(这对于 COM 的正确操作是必需的)。调用 CoInitialize(Ex) 失败通常会在应用程序生命期早期以失败的 COM API 函数的形式表现出来,最常见的是激活请求。但有时问题很隐蔽,直到一切都太晚了(例如对 Release 的调用一去不复返了)才表现出来。当开发小组将 CoInitialize(Ex) 调用添加到所有接触 COM 的线程之后,他们的问题就迎刃而解了。 
  具有讽刺意义的是,Microsoft 竟是 COM 程序员有时不调用 CoInitialize(Ex) 的原因之一。Microsoft 知识库中包含的一些文档中说,调用 CoInitialize(Ex) 对基于 MTA 的线程来说不是必需的(有关示例,请参阅文章 Q150777)。是的,在很多情况下,我们可以跳过 CoInitialize(Ex) 而不会出现问题。但是,这样是不应该的,除非您知道自己在干什么,并且可以绝对肯定自己不会受到负面影响。调用 CoInitialize(Ex) 是没有害处的,因此我建议 COM 程序员始终从某个与 COM 相关的线程中调用它。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • CoCreateInstance和CoCreateInstanceEx的区别??
  • 抓狂!看了几天了,CoCreateInstance总是出错!!!!救命啊!
  • 请教CoCreateInstanceEx产生E_ACCESSDENIED的原因
  • CoCreateInstance的内部实现问题??
  • 在DEV-CPP中编译建立快捷方式代码出现incompatibletypeforargument1of`CoCreateInstance'
  • 用dll的COM除了cocreateinstance能不能就当普通DLL用loadlibrary调用。
  • CoCreateInstanceEx问题
  • CoCreateInstance调用成功,CoGetClassObject调用失败,为什么?
  • CoCreateInstance调用出错,帮看看!
  • CoCreateInstance的问题

相关文章

  • 2017-06-04 如何解决"灾难性故障"?!
  • 2017-06-04 Activex控件的属性值如何永久存储?
  • 2017-06-05 问一个简单的dll编程问题
  • 2017-06-04 哪些兄弟有teechartproactivexv8005的安装程序发给我一份!
  • 2017-06-04 编程实现控制资源管理器中隐藏文件的显示?
  • 2017-06-04 用atl写ActiveX控件如何支持对象拖放?
  • 2017-06-05 如何正确的退出EXCEL进程
  • 2017-06-05 怎样使分配的内存页一直驻留在RAM里,而不被倒到硬盘页文件里?
  • 2017-06-05 如何编程实现:启动Win2000命令行程序,并向该命令行窗口输入一些字符串!执行后,命令行不关闭?
  • 2017-06-04 ATL开发控件自定义消息问题,如何在ATL生成的框架里把所有消息映射到一个函数里然后自己switchmsg来处理?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何监视其他机子在本机上建立DCOM对象,不论成功与否(纪录内容越详细越好)
    • windows串口编程急!高手请进。。。
    • 请问如何在一个已有的应用程序中添加自己的按钮
    • 谁有VC++编写ATL的好书(最好有实例的),小弟正在看《深入解析ATL》,想编程练习练习,帮帮忙~
    • 用CAxWindow动态加载浏览器控件,为什么vc6里好使,vc8总不行?
    • 哪位大哥有XP下隐藏进程的好例子hookapi
    • JS调用ocx,未处理的异常:可能是堆破坏
    • 调试exe组件的的问题
    • 有关文件上传问题FTP及HTTP)的讨论?在线
    • Metro用不上COM组件了吧?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有