1

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

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

如何与第二个客户端重用同一台服务器?

(问题已编辑以正确重新表述。在原始版本中,我问的是如何防止服务器终止,这不是一个好的表述)

4

6 回答 6

3

Delphi 的 COM 对象向导中有一个设置“实例化”。允许的值为“内部”、“多实例”、“单实例”。

我想用多个客户端重用同一个 COM 服务器。这就是我选择“单一实例”的原因,尽管我将为所有客户端提供我的服务器应用程序的单一实例。但是我错了。“单一实例”意味着我的服务器中只有一个 COM 连接实例。我应该选择“多实例”以允许同一服务器中的多个 COM 连接(但一个接一个,而不是同时)。

我认为Delphi中COM Object Wizard中使用的单词并不是很清楚。而不是“多实例”,“单实例”,最好像这篇关于 OLE Server 和 VB的文章中那样有“多用”和“单用” 。

于 2009-02-02T08:55:20.857 回答
2

在客户端,使用

ConnectKind := ckRunningOrNew

并且应该使用现有服务器而不是启动新服务器。

于 2009-01-30T15:22:22.107 回答
0

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

于 2009-01-30T15:07:34.290 回答
0

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

于 2009-01-30T15:13:49.833 回答
0

关于上一篇文章“在 Delphi 的 COM 对象向导中有一个设置“实例化”。:至少在 C++ builder 中,此选项可以在项目设置项“ATL”之后简单地更改。此项目仅在您添加第一个自动化对象后出现在 EXE-ole-server 中。

(我还要求这个精美页面的作者在第18 项中提及这一点。)。

于 2009-12-12T10:28:20.330 回答
0

您还可以尝试通过运行 dcomcnfg 并选择 Component Services/Computers/My Computer/DCOM Config 并选择您的服务器来更改启动 OLE 服务器的用户的身份(如果它是 Exe 而不是 dll)。

您可能不得不玩弄它,我不记得它们之间的区别,但我认为“交互式用户”应该这样做。

于 2009-12-12T22:56:53.063 回答