Apartment Model

在该模型中,一个对象和一个特定的线程有关联,只有在该线程的context之中才能够调用该对象。 COM的“apartment”是一个对象产生,运作和毁灭的地方。当client要求一个指向interface的指针,它是从一个特定的线程(也就是apartment)中发出请求。这个client可能只在该apartment中使用该interface指针。当然也有可能产生一个interface指针给其他的apartment使用,这种情况你必须使用COM函数 CoMarshalInterThreadInterfaceInStream() 和CoGetInterfaceAndReleaseStream()。

Apartment model的内部运作系使用消息队列 。COM为每个在apartment model中登记在案的线程产生一个不可见的窗口。而我们知道,一个窗口的消息只能被产生该窗口的线程处理。所以,使用消息队列可以自动强迫适当的线程处理对COM对象的调用。副作用是使用apartment model的线程必须有一个消息循环,否则调用COM对象时消息将不会被派送。

Free-Threaded Model

在这个模型中,对于out-of-proc COM server(是个exe而不是dll) 中的对象的调用动作,是由属于COM的线程发出。换句话说,即使你的程序只有一个线程,COM自己也有一缸子线程,用来调用你的COM对象。

如果server是in-proc(也就是dll形式 ),那么调用通常直接来自client,送往server,其间没有COM的介入。

在in-proc server和out-of-proc server之间,存在一个基本差异,那就是由谁产生线程。在in-proc server 中,线程的产生与否完全被client程序中的线程个数所控制。一旦in-proc server开始执行,其典型行为类似于一个正常的多线程dll与应用程序之间的互动。但在一个out-of-proc server中,线程是由COM产生的。

free-Threaded不依赖使用W'indows消息,所以没有必要拥有一个消息循环。避过消息循环,可以使得对free-threaded对象的调用能够比apartment model对象的调用更显著的快速处理。付出的代价是应用程序必须负起保护对象的完全责任。确定对象受到保护非常重要。在apartmodel中,由于外界请求总是一个个被处理,所以同步化控制根本不需要。

client程序也可以声明为free-threaded。一个free-threaded client可以完全地把一个interface 指针传递给另外一个线程,并且可以在任何时间对任何线程中的interface发出调用。这个意思是client可以对着同一个对象同时发出多个请求,也因此一个free client可能在同一个时间使用5个不同线程中的同一个interface指针。

 声明一个线程模型

一个COM client或者server必须声明其所支持的线程模型。对于exe文件,每个即将使用COM的线程都必须在调用任何COM函数之前先调用CoInitialize或者CoInitializeEX。线程模型即在那个时候选定。

CoInitialize内部调用CoInitializeEx,并制定线程模型为COINIT_APARTMENTTHREADED。如果使用复合文档(compound documents),你必须以OleInitialize将OlE初始化,而该函数内部会调用CoInitialize,如果使用复合文档,你就不能够在任何已经调用过OleInitialize的线程中使用free-threaded 对象。

HRESULT CoInitialize(
  LPVOID pvReserved  //must NULL
);

HRESULT CoInitializeEx(
  void * pvReserved,
  DWORD dwCoInit   //COINIT enum中的一个栏位  COINIT_APARTMENTTHREADED and COINIT_MULTITHREADED flags cannot both be set. 
);

返回值:如果成功,传回S_OK,如果参数不合法,传回E_INVALIDARG.如果线程先前调用过CoInitializeEx,并且给予不同的dwCoInit   值,传回RPC_E_CHANGED_MODEL.

Dll server的运作又不同了,他不是在启动时注册其线程模型,而是将模型种类存储在注册表中。在CLSID/InprocServer32项目之下,DLL放置一个键,名为ThreadingModel。

混合模型

一个应用程序在某些线程中使用apartment model而在另外一些线程中使用free-threaded model是可能的。所有被注册为free-threaded的线程被说是生活在他们自己的apartment中。因此会有一个free-threaded apartment和多个线程,以及一个或多个标准的apartment,每个有用单一线程。

 interoperability

一个client和server声明为不同的线程模型也是可能的。

如果client和server都是outofproc,那么COM就可以负责让2个人安全地沟通。如果free-threaded client调用一个apartment model server,那么COM就会将那些请求一个个排好,使server一次处理一个。如果一个apartment model client调用一个free-threaded sderver,那么server被允许正规地处理那些请求。

如果server是in-proc,那么com还是可以负责让通讯的两边交互。但是付出额外的代价。server通常被设计为in-proc,为的是让client发出的请求能直接到达server端,不必透过Com的协助。如果一个free-threaded client尝试使用一个apartment model 的in -proc server,那么CoM必须介入,做法是把请求掉往main apartment(也就是第一个调用CoInitializeEx的线程) ,并将每个请求一次送到in -proc server手上。

转载于:https://www.cnblogs.com/kwliu/archive/2010/12/29/2195899.html

《Win32多线程程序设计》学习笔记 第17章 OLE ActiveX COM相关推荐

  1. Win32多线程程序设计学习(第五章)

    目录 不要让线程成为脱缰野马 1,干净地终止一个线程 "TerminateThread() 是一个危险的函数,应该在最不得已的情况下才使用" 2,线程优先权(Thread Prio ...

  2. CSS3秘笈第三版涵盖HTML5学习笔记13~17章

    第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不 ...

  3. javascript高级程序设计 学习笔记 第五章 上

      第五章   引用类型的值(对象)是引用类型的一个实例.在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称呼并不妥当.尽管 ECMAScri ...

  4. 《游戏设计艺术(第2版)》——学习笔记(17)第17章 有种体验叫作故事

    <游戏设计艺术(第2版)>学习笔记(17) 第17章 有种体验叫作故事 故事/游戏的二象性 被动娱乐的迷思 梦想 事实 真实世界方法1:珍珠串 真实世界方法2:故事机 问题 问题1:好的故 ...

  5. 深入浅出Win32多线程程序设计

    引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的成员员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操 ...

  6. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  7. 中国大学MOOC实用Python程序设计学习笔记和课后测试1-3周(北京大学)

    中国大学MOOC实用Python程序设计学习笔记和课后测试1-3周(北京大学) 第1周 Python初探 为project设置解释器 保留字 第1周课后测试题 第2周 基本运算.条件分支和输出格式控制 ...

  8. C语言程序设计学习笔记:P5-循环控制

    本系列文章为浙江大学翁恺C语言程序设计学习笔记,前面的系列文章链接如下: C语言程序设计学习笔记:P1-程序设计与C语言 C语言程序设计学习笔记:P2-计算 C语言程序设计学习笔记:P3-判断 C语言 ...

  9. 《C Primer Plus》学习笔记—第12章

    目录 <C Primer Plus>学习笔记 第12章 存储类别.链接和内存管理 1.存储类别 1.作用域 2.链接 3.存储期 4.自动变量 1.程序hiding.c 2.没有花括号的块 ...

最新文章

  1. html地图周边搜索,html5 百度地图定位关键字搜索附近
  2. 蓝桥杯哈夫曼树java_Java实现蓝桥杯3n+1问题
  3. [JavaWeb-HTML]HTML标签_图片标签
  4. 手把手教你学会用Delve调试Go程序
  5. python json删除字段_如何使用python删除json对象?
  6. 【Java从0到架构师】SpringBoot - SpringMVC
  7. 初中计算机网络操作题,初中信息技术中考excel操作题
  8. oppo自带计算机版本,OPPO手机助手
  9. 2020 CCPC 威海(赛后重现)
  10. 4G模块配置、概念、调试记录
  11. 组态王日月年报脚本详解
  12. 自己动手实现@Autowired注解
  13. 《统计学习方法》第七章
  14. Bellman-Ford与spfa算法
  15. 删除Word文档空白页的方法,日常必备!
  16. 中国移动MIFI--CM510,4G TD-LTE MIFI 上网终端开箱及初步体验@上海
  17. mysql ssl 2026_解决连接到 Amazon RDS for MySQL 或 Aurora 实例时的 ERROR 2026 SSL 连接错误...
  18. c语言中求奇数的简单代码
  19. dea的matlab算法
  20. mysql到期_mysql 到期 即将到期

热门文章

  1. spring中的Aware
  2. Java设计模式:抽像工厂模式
  3. 开源企业IM免费企业即时通讯ENTBOOST V2014.177版本号正式公布
  4. 全面理解 ASP.NET Core 依赖注入
  5. Shiro 核心功能案例讲解 基于SpringBoot 有源码
  6. SPOJ - PHRASES Relevant Phrases of Annihilation —— 后缀数组 出现于所有字符串中两次且不重叠的最长公共子串...
  7. div+css实现表头固定内容滚动表格
  8. NOIP 2017 提高组 K: 奶酪 (SPFA || 并查集)
  9. 微服务架构:动态配置中心搭建
  10. OpenCV最基本的测试代码-图像的读取与显示