• 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 > 请教一个关于COM套间的问题彻底解决我会200分伺候

请教一个关于COM套间的问题彻底解决我会200分伺候

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

佚名通过本文主要向大家介绍了套间,套间装修效果图,套间平面图,套间是什么意思,酒店套间等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 请教一个关于COM套间的问题彻底解决我会200分伺候
描述:

按照书上说单线程套间模型的COM对象只能在自己的套间里执行,
但是我用ATL自己写了一个单线程套间的对象,在我的测试程序里面我从主线程通过COM库函数CreateInstance创建它,
然后,开了一个Work thread,把指针传给它,然后在它里面竟然调用成功了,并没有返回书上所说的那个什么WRONG_THREAD的错误!在这个线程里面我甚至都没有调用COM库的初始化函数!
这是怎么回事?希望高手解答!同时能把套间的概念解释清除最好了,但请不要用书本上的话,因为我怀疑那些写书的人自己可能都不懂套间的概念呢~~呵呵
下面是我的接口,贴上主要代码,我在辅助线程里面调用的就是test函数
class ITest : public IUnknown
{
 public:
   // ... 省略部分无关代码
   // ~~~~ 在辅助线程里面调用的它
   virtual HRESULT __stdcall test()
   {
         // 弹个框框~~
     MessageBox(NULL,"hey!","",0);
   };
}


解决方案1:

针对你的情况
结论:在辅线程中创建对象成功是可能的,但运行出错是必然的(不是指程序崩溃,而是逻辑错误)
举例类似出错情况:
就像多线程访问同一个全局变量,而没有加任何保护一样,安全吗?
COM套间的目的就是:处理并发问题
下面简单解释:
1.简单来讲:
套间:主要为了同步对组件的调用(内部有个消息循环),没什么复杂的
  
  稍微详细一点:
STA中只有一个线程可以执行,意味着驻留在STA中的对象永远也不可能被并发访问,只有一个特定的线程可以执行对象上的方法,所以对象的实现者可以安全地把多个方法调用用之间地中间状态保存在TLS(线程局部存储)中
2.接口指针列集(为什么要列集)
简单来讲:
  接口指针只是变换成可被传输的字节流,字节流的唯一内容标志了对象和它所拥有的套间
详细一点:
  COM在你列集过程中,会”隐式“产生代理和存根()
  在你的辅线程里,真正交互是,你与代理---存根与组件(可惜这里不能贴图,否则很容易明白了)
  所有这些操作最主要的目的就是:主线程和辅线程 对组件对象的操作都在同一个套间(可以理解为:向同一个消息队列中发消息)里,最终目的只是处理并发
3.下面是一些总结:
套间总结:
  (1)组件为 STA
       I客户地套间为STA,组件直接生活在客户的STA中,效率最高
       II客户的套间为MTA,进程内激活对象迫使COM在另一个套间(默认STA)中激活对象,然后返回给客户一个代理
   (2)组件为MTA
       I客户的套间为STA,那么类对象(以及后续的实例)将在COM创建的STA中执行
       II如果客户的套间为MTA,类对象将在MTA中执行


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

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

  • 为什么套间外调用sta组件还是并发执行的有例子
  • 进程外组件多线程套间中的对象在实现时如果只考虑进程外客户调用是否需要进行同步?
  • 在什么情况下算是跨套间?
  • 大家觉得一个程序内部使用的COM对象是否要遵守只在其建立的套间内执行的规则?
  • 为什么访问套间线程需要代理/存根,而访问自由线程就可以直接调用了?--请求回答
  • 跨套间marshal组件指针,用其返回其他组件对像出错!
  • 跨套间marshal来的对像指针查地址不为空,但是
  • 求高手指点COM套间类型的问题
  • 跨套间的com组件调用,什么时候com会自动marshal,什么时候需要手工marshal
  • 关于线程套间问题。

相关文章

  • 2017-06-04 关于msdxmocx在98的问题
  • 2017-06-04 100分求助如何将一个CEdit的子类封装成一个OCX控件?
  • 2017-06-05 菜鸟问:如何获取某进程的“特征码”呢?用来追踪某个程序?
  • 2017-06-04 救命啊!!我用CListCtrl时使用SetItemText设置某行某列值却老是更新了第一行,而不是我想更新的那行怎么回事,跟踪调试也发现行号没错
  • 2017-06-05 回调函数的问题!!高手请进!!很急,在线等
  • 2017-06-05 初学线程的一个小问题!
  • 2017-06-04 急急急!各位谁开发过OPC方面的程序啊
  • 2017-06-05 请教,settimer的问题
  • 2017-06-04 COM现在的发展如何
  • 2017-06-04 ATGrid报表控件/WEB插件[专业版]

文章分类

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

最近更新的内容

    • 进程内和进程外的区别
    • VC与FLASH之间的数组传送
    • 请问将组件设计成free模式的好处在哪里1?
    • 学习ATL需要ASP基础吗?
    • [请教功力深厚者]关于mbstowcs与CComBSTR。
    • 如何写出工具栏里那样的按钮效果?
    • 关于CComQIPtr
    • AfxBeginThread这句话报错,请各位帮忙看一下?
    • 开发一个中插入word文档的ActiveX有个数据持续化的问题,就是想把ActiveX的某个变量保存下次打开WORD时用这变量存到宿主word文档中
    • ImagelistattachedtothelistviewctrlActivexcontrol

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

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