visual basic 组件
将原有的visual basic 项目文件拷贝到新的开发环境中,用vb打开使用mts类库(mts.dll)开发的项目。检查项目使用的参考库,会发现mts类库已经被com+ services type library(comsvcs.dll)所代替了。
当microsoft visual basic创建新的com services组件的时候,它提供mts所有的函数。要确保这些函数能够被移植到windows 2000的组件正确的使用,microsoft给com services组件分配了和旧的mts组件完全一样的clsid。
基于visual basic的组件从表面上看是通过类型库的说明来访问mts的函数,但内部是通过clsid来访问的。在windows 2000中,基于visual basic的asp组件访问同样的函数,但是它通过新的com services组件。
作为将组件移植到新系统的测试,将vb中的项目文件不做任何修改进行编译,你会发现不仅编译过程没有任何的问题,而且在windows 2000中用asp页访问组件的表现也和在nt中是一样的—当然,这还要看组件的功用以及他访问什么样的外部进程。举例说,某组件实现objectcontrol以利用jit功能然后调用内建的asp response对象向客户端输出信息。
figure 8implementing objectcontrol
the response object instance
private m_oresponse as response
implementation of objectcontrol interface
implements objectcontrol
objectcontrol methods
private sub objectcontrol_activate()
dim ocontext as objectcontext
set ocontext = getobjectcontext()
set m_oresponse = ocontext("response")
end sub
for object pooling, required method
function objectcontrol_canbepooled() as boolean
objectcontrol_canbepooled = false
end function
cleanup
sub objectcontrol_deactivate()
set m_oresponse = nothing
end sub
use the response object instance
sub testresponse()
m_oresponse.write "hello windows 2000 world!"
end sub
在iis5.0中,将组件注册到component services并由asp页面访问的结果与在nt4中将组件注册到mts中的表现是一样的。注意,asp页面调用testresponse方法,它将激发jit调用objectcontrol activate方法,创建response对象输出“hello world”信息。
在两个操作系统环境中访问组件不同的地方在于组件在windows 2000中会较早的失效。windows nt4中只有在页面完全退出作用域时才被释放;在windows 2000中,组件在最后一个引用被释放时就释放了。因此,只要在asp页面中将组件的实例设为nothing(vbscript),vb的组件立刻就失效了。
当然,上面说的并不是asp组件在windows 2000和windows nt中表现不同的唯一的地方。如果组件原来用作调用windows nt特定的服务或执行某些操作,如输入/输出,windows 2000在实现上可能会有些不同,也就是说可能需要重写相关的代码来适应新的系统。不过,如果asp组件主要是使用某些技术(如activex data object–ado)访问数据库,这种情况受到的影响是最小的。
注意在windows 2000中开发组件和windows nt有一些不同,在windows nt中用visual basic(visual c++)开发注册到mts的组件时,每次编译后要刷新组件一次。原因是,vb(vc)会在组件(dll)生成后自动的注册一次。但是,visual basic创建的注册表实体会和mts为这个组件创建的注册表实体冲突。在重编译后通过在mts中刷新组件,会使mts修复相关的错误。
在windows 2000中,com+和mts并不是分割开来的,而被访问的组件通过visual basic或regsvr32.exe进行注册也是com+所支持的。com services仍然保留了refresh选项保持向后兼容性,但是已经不用在重编译后使用该选项。
谈到注册的问题,并不是非要重编译组件或者将它们添加到com+的应用中才能用asp访问,仍旧可以使用regsvr32.exe注册组件。使用regsvr32.exe注册组件或把组件添加到com+应用中唯一不同的com+考虑经配置的组件,而regsvr32.exe考虑未配置的组件。只要组件不使用事务处理和jit功能,他仍旧会工作的很好,而不管是如何注册的。
windows 2000中的visual c++组件
如果使用visual c++开发asp组件,platform sdk安装程序会把sdk类库和头文件添加到开发环境中,如图9。如在visual basic中一样,asp组件在visual c++中重编译的过程不需要或只需要很少的改变,这包括任何使用atl组件向导创建的asp或mts组件。
在使用visual c++ 6.0 atl 向导创建asp组件的时候,会使用scriptingcontext对象和onstartpage 和onendpage事件处理程序,以例示scriptingcontext对象、创建asp内建对象实例以及清除对象。microsoft保留这些引用主要是为了保证向后兼容性,而使得这些组件可以工作在windows 2000和iis 5.0环境下,
尽管scriptingcontext依旧存在,但是不要再继续使用它们进行开发工作。作为替代,应当使用其它的atl object wizard选项或者使用组件类库进行开发。请认真的考虑一下再将涉及scriptingcontext组件移植到windows 2000中,在未来该对象将不再被支持。
在使用atl object wizard创建mts组件时,会把mts类库和头文件加入到项目中。如下列代码会自动的添加到组件的头文件中。
#include <mtx.h>
在windows 2000中mts已经被com+替代,mts类库也被com service类库替代。那么,mts组件是如何成功的编译并工作呢?
答案很简单,打开platform sdk所附带的mtx.h文件就真相大白了:
// copyright (c) 1995-1999 microsoft
// corporation. all rights reserved.
#define __mtxspm_library_defined__
#include "comsvcs.h"
platform sdk所带的mtx.h文件其实就是com services头文件的包装文件。如果检查visual c++项目的外部相关性(external dependencies),你会发现comsvcs.h包含在列表中而不是mtx.h。这个文件也是为什么要把platform sdk的库和包含文件放置到visual studio安装的文件前面的原因之一,要确保组件选择了正确版本的头文件,比如mtx.h。
实际上你可以改变组件中的代码来不引用mtx.h:
#include <comsvcs.h>
这并不会影响到最终结果,在windows 2000中asp组件可以注册成为com+应用并由asp页面访问。
还是那句话,迁移过来的组件在windows 2000中拥有和nt4中一样的组件服务。但是,如果没有认真的考虑和广泛的修改,你并不能使用windows 2000 com+新的服务功能。
