COM组件技术讲义06

更新时间:2023-06-07 10:33:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

COM组件技术讲义

COM多线程模型、DCOM

潘爱民

/compcourse

COM组件技术讲义

内容

复习:COM聚合和COM跨进程模型 COM线程模型

分布式COM(DCOM)

–DCOM基本结构

–对象激活连接管理并发管理DCOM安全模型

COM组件技术讲义

COM组件技术讲义

COM组件技术讲义

COM组件技术讲义

聚合模型的要点

外部对象

–创建内部对象的时候,外部对象必须把自己的

IUnknown接口指针传给内部对象

–当外部对象接到对于聚合接口的请求时,它必须调用非委托版本的IUnknown的QueryInterface函数,并把结果返回给客户

内部对象

–内部对象类厂的CreateInstance必须检查pUnkOuter 参数–嵌套聚合:传递最外层的pUnkOuter参数

–除了非委托版本的IUnknown之外,其他接口的

三个IUnknown调用必须全部委托给外部对象的

pUnkOuter

COM组件技术讲义

COM组件技术讲义

自定义列集的要点

对象必须实现IMarshal接口

代理对象也必须实现IMarshal接口,并且代理对象与进程外对象之间协作

代理对象必须负责所有接口的跨进程操作 典型用途:

–提高跨进程调用的效率,使用缓存状态等优化技术

–marshal-by-value

COM组件技术讲义

COM组件技术讲义

进程外组件注意事项

自注册方式的变化

–命令行参数/RegServer和/UnregServer

注册类厂

何时被卸载

调用CoInitialize和CoUninitialize

实现自定义接口的代理/存根组件

COM组件技术讲义

多线程特性

Win32线程和COM线程

marshaling和同步

套间线程

自由线程

进程内组件的线程模型

COM组件技术讲义

进程和线程

进程

–在Linux平台上,时间和空间概念的结合–在Windows平台上,是个空间概念

线程

–在Linux平台上,一个执行环境

–在Windows平台上,也是一个调度单元,是个时间概念

COM组件技术讲义

Win32系统线程本身只有一种,根据应用模型可分为两种

CreateThread,创建线程

UI线程(user-interface thread)

–包含消息队列,当线程首次调用Win32User或GDI函数时产生

–常常包含消息循环,组合GetMessage/TranslateMessage/DispatchMessage

辅助线程(worker thread)

–一条执行线索,没有UI,没有消息概念

COM组件技术讲义

按照COM对象的执行环境,分为套间线程和自由线程

套间线程(apartment thread)

–位于一个STA中(Single-Threaded

Apartment)

–一个套间对应一个线程

自由线程(free thread)

–位于MTA中(Multi-Threaded Apartment)–一个进程有一个MTA,它可以包含任意数量的自由线程

COM组件技术讲义

marshaling

调用者与被调用者如果位于不同的线程中,则调用过程要有两次线程切换,线程切换也需要用到marshaling机制

COM对象的线程相依性

–有的COM对象只能在一个线程中运行

–内含UI的COM对象只能在创建线程上运行 线程之间的marshaling机制与进程间的marshaling过程一致

COM组件技术讲义

同步

只能被一个线程访问的对象不需要同步–例如Windows的窗口过程

–但是对于全部变量的访问,仍需要同步保护 有可能被多个线程访问的对象需要有同步机制

–Event、Semaphore、CriticalSection、Mutex–这样的代码被称为thread-safe

COM组件技术讲义

Apartment(套间)

是一个逻辑概念,也有实体对应 是COM对象的执行环境

分为三种套间

–STA

–MTA

–COM+引入TNA(thread-neutral apartment) *

COM组件技术讲义

STA套间

每个STA套间包含一个线程

–STA套间和线程有一一对应关系

当线程被创建后,用COM库初始化就建立起一个STA套间

–CoInitialize(NULL);

–或者CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); 在线程结束之前,调用CoUninitialize结束套间 套间线程包含消息循环

COM在套间线程中创建了一个隐藏的窗口–用途:同步、分发消息

COM组件技术讲义

STA套间(续)

在STA中创建的COM对象都属于这个STA STA对象不必处理同步,因为对象的方法代码只能被这个STA套间的线程调用

但DLL程序的引出函数如DllGetClassObject和DllCanUnloadNow等仍需同步处理。 类厂是否需要线程安全,取决于类厂的策略 如何把接口指针交给调用者

–自动marshaling

–手工marshaling

COM组件技术讲义

COM组件技术讲义

STA套间传递接口指针 通过COM传递的接口指针,COM都会自动marshaling

手工marshaling

–CoMarshalInterface和CoUnmarshalInterface–CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream

本文来源:https://www.bwwdw.com/article/s5i1.html

Top