Delphi中自动化对象的调用与释放的问题? ( 积分: 200 )

  • 主题发起人 主题发起人 IUnKnow
  • 开始时间 开始时间
I

IUnKnow

Unregistered / Unconfirmed
GUEST, unregistred user!
首先,自己创建一个可执行的自动化服务器Server程序;然后再编写一个Client程序,使用Variant通过CreateOleObject GetActiveOleObject等函数调用。

问题:
1)正常情况下,在Client创建/获取Server OLE对象后,如果关闭Client程序,则Server OLE对象也被自动关闭。怎样才能做到关闭Client程序时Server OLE对象不被关闭;
2)在Client程序在创建/获取Server OLE对象后,直接关闭Server程序,这时会提示信息说有其他程序在使用该程序。怎样做到使Server不产生提示而直接退出,且不影响Client程序运行?

(此功能在调用Word.Application时均可以实现)
 
首先,自己创建一个可执行的自动化服务器Server程序;然后再编写一个Client程序,使用Variant通过CreateOleObject GetActiveOleObject等函数调用。

问题:
1)正常情况下,在Client创建/获取Server OLE对象后,如果关闭Client程序,则Server OLE对象也被自动关闭。怎样才能做到关闭Client程序时Server OLE对象不被关闭;
2)在Client程序在创建/获取Server OLE对象后,直接关闭Server程序,这时会提示信息说有其他程序在使用该程序。怎样做到使Server不产生提示而直接退出,且不影响Client程序运行?

(此功能在调用Word.Application时均可以实现)
 
使用时必要使用 server.quit 啊,自动化对象不会自动退出的 ...
 
要自己写quit
 
我以实例重新描述一下:

1)创建Server程序:
新建一个VCL APP(名称"Server1"),给APP添加Automation Object(类型库"Server1",接口"Intf1"),Default设置,运行程序以注册类型库;

2) 创建Client程序:
新建一个VCL APP(名称"Client"),添加两个按钮,如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
MyVar:=CreateOLEObject('Server1.Intf1');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MyVar:=GetActiveOLEObject('Server1.Intf1');
end;


问题:
1)运行Client后执行不Button1可以打开Server1,但关闭Client后,Server1也自动关闭。而我希望的是让Server1仍然正常运行。而且若先关闭Server会产生提示信息,我希望如何避开该提示信息而直接关闭;

1)先运行Server1,再运行Client,执行Button2,提示出错,不能获得Server1对象,请问为何?

急盼高手回复!!!
 
第一个 Client 激活 Server1,在 Server1 内在一次引用一个 Server1 的实例,这样 Client关闭后, 因为 Server1 还最少存在一个引用计数,所以 Server1 不会被释放,可以在新的 Server1 利用一个计时器,和退出方法来减少引用计数从而结束 Server1 的运行。
 
多人接受答案了。
 
问题已解决,结帖,分数照样给。

用 CoDisconnectObject(Self as IUnknown, 0);即可!
 
后退
顶部