F
fangfei
Unregistered / Unconfirmed
GUEST, unregistred user!
最近拜读了李维老师的《Delphi 5.X ADO/MTS/COM+ 高级程序设计篇》一书,发现几个问题,和大家交流一下。
1、关于在COM+环境中如何建立COM+ component
李老师在书中306页讲到COM+已不需像MTS那样一定要先取得ObjectContext,然后调用ObjectContext.CreateInstance来建立了,可直接像建立一般的COM对象一样用CoCreateInstanceEx或CoCreateInstance来建立了,但在P441页又强调在MTS/COM+环境中一定要用ObjectContext.CreateInstance来建立。我参考了一些其它资料,应该是COM+中不必再区分一般COM/DCOM对象和COM+对象,都可以用CoCreateInstance(Ex)来建立。可见李老师行文也有不严谨之处。
2、关于线程模式
A、WIN2K的Neutral Apartment和Rental Apartment模式
李老师在书中给人的感觉好像是Delphi 5就支持WIN2K的这两种模式,D5不支持那D6一定会支持所有的COM+线程模式,还说Delphi是对COM+线程模式支持的最好的一个工具,可是D5、D6好像都不支持WIN2K下COM+的这两种线程模式。书中第307讲到“那么一个COM+对象要如何指明它可以执行在Neutral Apartment中呢?很简单,就像STA和MTA一样,只要在COM+对象注册信息的Threading Model一项中设定它的数值为Neutral就可以了。如果要使用Rental Apartment,就只需要再设定Synchronization执行属性为Required即可。”, 到哪去设定呀?Synchronization倒是在TypeLibrary Editor中的COM+页上可以找到,可Neutral呢?没得选呀,只有Single,Apartment和Both呀,不会是叫我们去改注册表吧!
B、Single模式
李老师说MTS/COM+开启时会预先建立100个Single线程,所以使用Single会有比较好的效率,书中又在多处强调要充分利用MTS/COM+的各种Pooling机制,可我发现在COM+下,如果用Single(或Apartment)模式,根本不能使用Object pooling,只有Both可以使用Object Pooling。
3、关于修改Delphi的事务支持
书中讲到Delphi为支持BDE及第三方控件,在TDataSetProvider中会自己进行事务控制,为了能在MTS/COM+中正确支持事务,必须修改Provider单元,以便在MTS/COM+环境中不触发事务控制,这是对的,可在书中P491页又讲到“此外,把ResolveToDataSet设定为True也可以避免MIDAS在MTS/COM+中触发额外事务管理的臭虫。” 我看了一下D6中几个相关单元的源码,似乎设定TDataSetProvider.ResolveToDataSet := True并不能避免TDataSetProvider触发额外的事务管理,还是得修改源代码才行。
1、关于在COM+环境中如何建立COM+ component
李老师在书中306页讲到COM+已不需像MTS那样一定要先取得ObjectContext,然后调用ObjectContext.CreateInstance来建立了,可直接像建立一般的COM对象一样用CoCreateInstanceEx或CoCreateInstance来建立了,但在P441页又强调在MTS/COM+环境中一定要用ObjectContext.CreateInstance来建立。我参考了一些其它资料,应该是COM+中不必再区分一般COM/DCOM对象和COM+对象,都可以用CoCreateInstance(Ex)来建立。可见李老师行文也有不严谨之处。
2、关于线程模式
A、WIN2K的Neutral Apartment和Rental Apartment模式
李老师在书中给人的感觉好像是Delphi 5就支持WIN2K的这两种模式,D5不支持那D6一定会支持所有的COM+线程模式,还说Delphi是对COM+线程模式支持的最好的一个工具,可是D5、D6好像都不支持WIN2K下COM+的这两种线程模式。书中第307讲到“那么一个COM+对象要如何指明它可以执行在Neutral Apartment中呢?很简单,就像STA和MTA一样,只要在COM+对象注册信息的Threading Model一项中设定它的数值为Neutral就可以了。如果要使用Rental Apartment,就只需要再设定Synchronization执行属性为Required即可。”, 到哪去设定呀?Synchronization倒是在TypeLibrary Editor中的COM+页上可以找到,可Neutral呢?没得选呀,只有Single,Apartment和Both呀,不会是叫我们去改注册表吧!
B、Single模式
李老师说MTS/COM+开启时会预先建立100个Single线程,所以使用Single会有比较好的效率,书中又在多处强调要充分利用MTS/COM+的各种Pooling机制,可我发现在COM+下,如果用Single(或Apartment)模式,根本不能使用Object pooling,只有Both可以使用Object Pooling。
3、关于修改Delphi的事务支持
书中讲到Delphi为支持BDE及第三方控件,在TDataSetProvider中会自己进行事务控制,为了能在MTS/COM+中正确支持事务,必须修改Provider单元,以便在MTS/COM+环境中不触发事务控制,这是对的,可在书中P491页又讲到“此外,把ResolveToDataSet设定为True也可以避免MIDAS在MTS/COM+中触发额外事务管理的臭虫。” 我看了一下D6中几个相关单元的源码,似乎设定TDataSetProvider.ResolveToDataSet := True并不能避免TDataSetProvider触发额外的事务管理,还是得修改源代码才行。