Delphi7中如何用COM+组件调用其它的COM+组件 ( 积分: 0 )

  • 主题发起人 主题发起人 zhulilong
  • 开始时间 开始时间
Z

zhulilong

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi7中如何用COM+组件调用其它的COM+组件,是否需要修改ComObj程序单元中的CreateComObject和CreateRemoteComObject?如何修改呢?
 
Delphi7中如何用COM+组件调用其它的COM+组件,是否需要修改ComObj程序单元中的CreateComObject和CreateRemoteComObject?如何修改呢?
 
不需要使用,其它的组件也是你自己写的吗?
只要有知道COM+组件的ClassID,和IID就可以调用了
 
建议看看李维的三本书,书上都有,你要的话我有的哈
 
用ObjectContext.CreateInstance
不能用coXXX.create
 
To 张鸿林,我试过可以用coXXX.create啊?!
 
to JamesBond_L,确实可能可以运行
具体为什么要这样,得去看一下Com+中ObjectContext的机制
李维在他的com+书中,为了能统一使用coXXX.create,他修改了
ComObj.pas中相应的实现:
function CreateComObject(const ClassID: TGUID): IUnknown;
begin
//!!! Modified By Gordon Li
if (Getobjectcontext=nil)then
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result))//old
else
GetObjectContext.CreateInstance(ClassID,IUnknown,Result);
end;

function CreateRemoteComObject(const MachineName: WideString;
const ClassID: TGUID): IUnknown;
const
LocalFlags = CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER or CLSCTX_INPROC_SERVER;
RemoteFlags = CLSCTX_REMOTE_SERVER;
var
MQI: TMultiQI;
ServerInfo: TCoServerInfo;
IID_IUnknown: TGuid;
Flags, Size: DWORD;
LocalMachine: array [0..MAX_COMPUTERNAME_LENGTH] of char;
begin
//Modifried Bygordon Li
if (GetObjectContext=nil) then
begin
if @CoCreateInstanceEx = nil then
raise Exception.CreateRes(@SDCOMNotInstalled);
FillChar(ServerInfo, sizeof(ServerInfo), 0);
ServerInfo.pwszName := PWideChar(MachineName);
IID_IUnknown := IUnknown;
MQI.IID := @IID_IUnknown;
MQI.itf := nil;
MQI.hr := 0;
{ If a MachineName is specified check to see if it the local machine.
If it isn't,do
not allow LocalServers to be used. }
if Length(MachineName) > 0 then
begin
Size := Sizeof(LocalMachine);
// Win95 is hypersensitive to size
if GetComputerName(LocalMachine, Size) and
(AnsiCompareText(LocalMachine, MachineName) = 0) then
Flags := LocalFlags else
Flags := RemoteFlags;
end else
Flags := LocalFlags;
OleCheck(CoCreateInstanceEx(ClassID, nil, Flags, @ServerInfo, 1, @MQI));
OleCheck(MQI.HR);
Result := MQI.itf;
end
else
GetObjectContext.CreateInstance(ClassID,IUnknown,Result);
end;

如果你按上法修改,就可以放心调用coXXX.create
 
我学习COM+不久,一开始就并没有考虑到这样调用是否存在问题,但是我并没有用到李维的代码作出来的组件,然后调用coXXX.create正常,到现在为止,我不清楚究竟你是出于怎么样的考虑,而说“不能用coXXX.create”。能否明言?
还是你的意思是,用coXXX.create存在不好的地方?
 
最主要的是考虑数据库事务在组件间传递问题
如果你不使用ObjectContext对象,事务是无法传递的
你可以做这样的测试:
组件1,支持事务,提交一条记录
组件2,支持事务,提交一条记录(数据库后台加约束,使它提交不成功)
组件3,协调对象,需要事务,访问组件1的提交方法,又访问组件2的提交方法
我们希望他们同时成功或同时失败
如果用coXXX.create做,效果就不是这样了
 
不知道我弄错了,还是你弄错了,以我所知(这几天测试过),如果你在客户端使用coXXX.create组件1,或者组件2,它们也一样都不会启动COM+的事务管理功能,而用ObjectContext建立它们时,能启动事务管理功能。
所以,决定COM+是否启动事务,不是coXXX.create决定的,而是它们的事务类型决定,而你说“不能用coXXX.create”也不过是在你这样特定的情况下发生,说法片面了。
但是你把组件1、2的事务属性设置为需要事务,则不存在你说的问题。
ObjectContext只是为了能对【支持事务】类型的组件启动事务管理功能,那样可能让程序员灵活控制。
 
不知道我弄错了,还是你弄错了,以我所知(这几天测试过),如果你在客户端使用coXXX.create组件1,或者组件2,它们也一样都不会启动COM+的事务管理功能,而用ObjectContext建立它们时,能启动事务管理功能。
==========
1.客户端使用ObjectContext是无效的
2.
>>如果你在客户端使用coXXX.create组件1,或者组件2,它们也一样都不会启动COM+的事务管理功能
这是当然的,所以要使用协调对象在服务器端解决事务传递问题
在客户端,照样使用CoXXX.create(Remote)的方法创建协调对象
 
看来我的主要需要说明的问题你还是不明白。
的确“客户端使用ObjectContext是无效的”,是我给这些概念混淆了。
但是我的主要目的是说
“不能用coXXX.create”也不过是在你这样特定的情况下发生,说法片面了。”
容易误导别人。
 
原题是:
>>Delphi7中如何用COM+组件调用其它的COM+组件
我的第一个回答是针对"COM+组件调用其它的COM+组件"的:
>>用ObjectContext.CreateInstance
>>不能用coXXX.create
 
刚才再看了李维的那本说,也是这样说,在组件建立组件必须采用ObjectContext.CreateInstance,否则可能出现执行错误,但是我的确在根组件下采用coXXX.create来建立另外一个组件,事务也执行一样正常。组件的事务类型全部都是需要事务。都不知道还能否用这样的方法了~看来还是了解不够深刻~
 
关注
这个问题我到现在也没怎么搞清楚!
 
用COM+调用COM+,有这个必要吗?
会不会多此一举啊?我有点糊涂。
 
我觉得有时候有这个必要~
感觉这样有点像调用一个SQL存储过程。
 
后退
顶部