我写了一个 OLE 自动化服务器(使用 Delphi)。我通常手动启动 OLE 服务器并将其用作普通应用程序。我不时启动一个客户端,它会自动连接到现有的 OLE 服务器。
当我终止客户端时,服务器不会终止(至少在客户端之前手动启动它时),但它不会接受任何其他 OLE 连接。启动另一个客户端将触发一个新服务器,而不是重用第一个。
如何与第二个客户端重用同一台服务器?
(问题已编辑以正确重新表述。在原始版本中,我问的是如何防止服务器终止,这不是一个好的表述)
我写了一个 OLE 自动化服务器(使用 Delphi)。我通常手动启动 OLE 服务器并将其用作普通应用程序。我不时启动一个客户端,它会自动连接到现有的 OLE 服务器。
当我终止客户端时,服务器不会终止(至少在客户端之前手动启动它时),但它不会接受任何其他 OLE 连接。启动另一个客户端将触发一个新服务器,而不是重用第一个。
如何与第二个客户端重用同一台服务器?
(问题已编辑以正确重新表述。在原始版本中,我问的是如何防止服务器终止,这不是一个好的表述)
Delphi 的 COM 对象向导中有一个设置“实例化”。允许的值为“内部”、“多实例”、“单实例”。
我想用多个客户端重用同一个 COM 服务器。这就是我选择“单一实例”的原因,尽管我将为所有客户端提供我的服务器应用程序的单一实例。但是我错了。“单一实例”意味着我的服务器中只有一个 COM 连接实例。我应该选择“多实例”以允许同一服务器中的多个 COM 连接(但一个接一个,而不是同时)。
我认为Delphi中COM Object Wizard中使用的单词并不是很清楚。而不是“多实例”,“单实例”,最好像这篇关于 OLE Server 和 VB的文章中那样有“多用”和“单用” 。
在客户端,使用
ConnectKind := ckRunningOrNew
并且应该使用现有服务器而不是启动新服务器。
当您将服务器作为普通应用程序启动时,您应该能够增加自动化服务器的引用计数器。您要实现的目标有两个:让服务器在客户端退出时不终止,并且在客户端仍在运行时关闭主窗体时让服务器不终止。
将 COM 对象创建为 Singleton。并且即使在客户端离开后也保持对象运行,请添加额外的引用计数。为此,请在 COM 对象内调用一次 QI。
关于上一篇文章“在 Delphi 的 COM 对象向导中有一个设置“实例化”。:至少在 C++ builder 中,此选项可以在项目设置项“ATL”之后简单地更改。此项目仅在您添加第一个自动化对象后出现在 EXE-ole-server 中。
(我还要求这个精美页面的作者在第18 项中提及这一点。)。
您还可以尝试通过运行 dcomcnfg 并选择 Component Services/Computers/My Computer/DCOM Config 并选择您的服务器来更改启动 OLE 服务器的用户的身份(如果它是 Exe 而不是 dll)。
您可能不得不玩弄它,我不记得它们之间的区别,但我认为“交互式用户”应该这样做。