12.1.10 使用ATL创建进程外组件
1.问题阐述
在前面创建的组件均属于进程内组件,即组件对象和客户进程在同一个进程,客户进程在同一进程内调用组件对象提供的服务;进程外组件,组件对象和客户进程分属不同的进程,客户进程可以跨进程调用组件对象提供的服务。如何创建一个进程外的组件呢?
2.实现技巧
使用ATL创建组件向导创建一个进程外组件,首先使用ATL COM AppWizard创建一个工程,如图12-11所示。
单击【OK】按钮,选择组件提供服务时所用的类型。在此因为是进程外组件,故选用Executable类型,如图12-12所示。
|
| (点击查看大图)图12-11 创建工程 |
|
| (点击查看大图)图12-12 选择组件提供服务器的类型 |
最后添加组件提供的接口,和前面介绍的就基本一致了。
3.实例代码
本例的消费者和生产者的简单模型由COM来实现。
组件服务器具体创建步骤如下。
(1)用ATL COM Appwzard创建一个新的工程,工程名为ProcOut。
(2)选择组件提供服务时所用的类型(.dll或.exe)。
(3)在工程中插入一个对象。在ClassView选项页面,用鼠标右键单击工程名,在弹出的右键菜单中选择【New ATL Object】,在打开的对话框中选中Simple Object,如图12-13所示。
|
| 图12-13 新建组件对象 |
|
| 图12-14 组件命名 |
|
| 图12-15 添加生产函数 |
|
| 图12-16 添加消费函数 |
|
| 图12-17 添加属性 |
(8)组件服务的代码,组件服务提供了生产和消费函数及改变属性的两个函数,其代码参考如下。
在类Cobject的头文件Object.h中添加成员变量:
int m_lNum;//表示当前的数量
生产函数的参考代码如下:
STDMETHODIMP CObject::Produce(long nProduce) |
STDMETHODIMP CObject::Customer(long nCustomer) |
STDMETHODIMP CObject::get_CurrentNum(long *pVal) STDMETHODIMP CObject::put_CurrentNum(long newVal) |
(9)在客户端创建一个基于对话框的工程ProcOutTest,放置两个文本框分别表示生产或消耗的数量和当前现存的数量。放置两个按钮,用于响应生产和消费事件。参考代码如下。
在ProcOutTest的InitInstance中添加AfxOleInit( )初始化应用程序COM环境。
在stdafx.h中引入ProcOut.tlb库:
#import "ProcOut.tlb" no_namespace |
IobjectPtr m_Iobject |
HRESULT hr = m_IObject.CreateInstance(L"ProcOut.Object"); |
void CProcOutTestDlg::OnProduceBtn() void CProcOutTestDlg::OnCustomerBtn() |
|
| 图12-18 生产和消费 |
| 回书目 上一节 下一节 |







