特别应当注意:Visual C++向导仍采用术语“MTS”,Visual C++头文件和静态库名称中仍含有“mtx”。因此,本节中我们使用术语“MTS/COM+”,而不只是“COM+”。
Visual C++在两个方面提供MTS/COM+支持:一是在创建项目时,二是在项目中使用指定的组件时。
首先来看一下MTS/COM +对于项目的支持。当编译和链接项目时,便转换为DLL或EXE。在项目中使用MTS/COM+服务时,必须链接指定的库。Visual C++ AppWizard可帮助完成此项任务。
在你第一次创建项目时,可能已注意到了Support MTS复选框,如图18 - 5所示。
如果选定此复选框,不会产生附加代码,但向导改变项目设置使其“启用COM+”。特别是,向链接线增加了mtx.lib、mtxguid.lib和delayimp.lib库。因此,如果没有对上述复选框进行选定,仍可通过如图1 8 - 6所示的方式在链接线中添加这些文件名,使现有的组件“启用COM+”。
另一个选择是创建启用COM+的组件。当在项目上添加一个新的ATL组件时,选择MSTransaction Server Component,如图1 8 - 7所示。
单击属性页将出现图1 8 - 8所示的内容。
创建MTS/COM+对象时,向导将在项目中添加代码,下面看一下这种配置产生的附加代码。
在新组件的头文件中,你可看到增加了一个包含文件:
#include <mtx.h>
和用于ASP内置对象的包含文件类似,此文件包含在C++组件中使用MTS/COM+组件所需的常数和定义。组件中头文件还有一处改变:
DECLARE_NOT_AGGREGATABLE(CTableStorage2)
MTS/COM+对象不能作为其他对象集合体的一部分使用。因此,必须插入代码防止这种情况发生。
如果不使用AppWizard创建组件,使组件“启用COM+”是非常容易的。如果选择IObjectControl支持,应该在项目中插入下列附加代码。组件的头文件中也有些改变。
首先,组件继承IObjectControl接口,因此它必须实现该接口定义的方法:
确保向导声明了IObjectControl的方法和ObjectContext的指针。
向导在源文件中实现这些方法。当第一次使用对象时调用Activate方法,并自动生成ObjectContext的指针。
如果选择IObjectControl支持,而没有缓冲对象,CanBePooled方法将返回FALSE:
后面将详细讨论对象缓冲问题。最后,当对象不再使用时,将释放对IObjectContext的引用。
对于服务器组件,有许多MTS/COM+接口可用。下面以IObjectContext接口为例进行讨论。
18.2.1 IObjectContext的事务处理
每个MTS/COM+对象均有相应的环境。环境隐含着与对象相关的状态,包含对象的执行环境信息和参与的事务的信息。
IObjectContext可完成下列功能:
? 声明工作完成。
? 不允许提交暂时的或永久的事务。
? 在当前事务范围内开始新的MTS/COM+对象。
? 检查调用者的角色。
? 检查安全性。
? 检查事务状态。
在前一节中,组件已经有一个对IObjectContext接口的引用。我们将实现Clear方法,从组件中删除所有数据。对ITableStorage2接口添加一个不带任何参数的Clear()方法,用下列代码填写此方法的主体中:
这个方法的目的是删除组件中的所有数据。必须检查ObjectContext的引用是否确实存在。如果在COM+以外使用组件,这个指针的值不存在,进行引用会引起组件崩溃。在这个例子中,调用SetComplete方法告诉COM+“不再保持状态,可以释放。”
18.2.2 IObjectControl的对象缓冲
IObjectControl接口用于对象缓冲,可增强应用程序的性能。当超出对象的使用范围时,被缓冲的对象不会真的破坏,只是处于无效状态。当请求这种类型的对象时,可以重新使用这个对象,组件被循环使用。性能增强的原因是当一个对象无效时,对象没有完全损坏,因此就不需执行很多工作。同样,激活一个无效对象也不需执行很多工作。
在创建MTS/COM+对象时,对象缓冲可通过ATL Object Wizard Properties对话框启用,如图1 8 - 9所示。
注意Can be pooled选项只能在选定Support IObjectControl后才能选定。另一种方式是将CanBePooled方法中的返回值改为TURE:
使用对象缓冲所需做的工作仅此而已。
上面讲述了组件如何与ASP和COM+相互作用,下面我们讲述组件如何访问永久性数据。