2009-01-30 38 views
1

我写了一个OLE自动化服务器(使用Delphi)。我通常手动启动OLE服务器并将其用作普通应用程序。我不时启动一个客户端,其中 自动连接到现有的OLE服务器。如何与第二个客户端重用(Delphi)OLE服务器?

当我终止客户端时,服务器不会终止(至少在客户端之前手动启动时),但它不会接受任何其他OLE连接。启动另一个客户端将触发一个新的服务器,而不是重新使用第一个。

如何重复使用与第二个客户端相同的服务器?

(编辑题正确地重新制定它在原来的版本我是问如何防止服务器终止,这是不是一个很好的配方)

+0

如果启动服务器的两个客户端,同一个进程处理两个客户端,还是启动另一个服务器进程,会发生什么情况? – mghie 2009-01-30 15:14:20

+0

第二个服务器进程自动启动。 – Name 2009-01-30 15:16:13

回答

2

在Delphi的COM对象向导中有一个“Instancing”设置。允许的值是“内部”,“多个实例”,“单一实例”。

我想重复使用与多个客户端相同的COM服务器。这就是我选择“单一实例”的原因,尽管如此,我将为所有客户端提供一个服务器应用程序实例。但是我错了。 “单实例”意味着我的服务器中只有一个COM连接实例。我应该选择“Multiple Instance”以允许在同一台服务器上进行多个COM连接(但一个接一个,不能同时)。

我认为在Delphi的COM对象向导中使用的词语并不十分清楚。除了“多个实例”,“单个实例”之外,像这个article about OLE Server and VB这样的“多用途”和“单次使用”会更好。

0

你应该能够增加的引用计数器自动化服务器当您启动服务器作为正常的应用程序。您想要实现的功能有两方面:让客户端退出时不终止服务器,并且在客户端仍在运行时关闭主窗体时让服务器不终止。

+0

我的问题不够精确。我现在编辑它。 但是,谢谢你的回答:在我让客户端启动服务器并且想在关闭客户端后保留服务器的情况下,这可能是有用的。 – Name 2009-01-30 15:14:41

0

将COM对象创建为单例。并且即使在客户端运行之后也保持对象运行,请增加额外的引用计数。为此,在COM对象内部调用一次QI。

2

在客户端,使用

ConnectKind := ckRunningOrNew

和现有的服务器应该使用的,而不是开始一个新的。

0

关于Delphi中的COM对象向导中的前一篇文章'有一个设置“Instancing”的说明。 :至少在C++ builder中,这个选项可以简单地在项目设置项“ATL”中改变后。此项目仅在为其添加第一个自动化对象后才会出现在EXE-ole-server上。

(我也问了作者This fine page在第18项中提到这一点)。

0

通过运行dcomcnfg并选择组件服务/计算机/我的电脑/ DCOM配置并选择您的服务器,您还可以尝试更改启动OLE服务器的用户的身份(如果它是Exe而不是dll)。

你可能需要玩弄它,我不记得它们之间的差异,但我认为“交互式用户”应该这样做。