我打算在现有应用程序中添加一个COM接口(顺便说一下,它是用C ++用Win32编写的)。我有一些经验使用 COM对象,所以我知道接口的基本COM概念等,但这是我第一次实际实现一个组件。
最终我希望能够使用COM接口从VB等脚本自动化我的应用程序。我知道有两个步骤:
由于MIDL中的服务器在EXE中的东西已经有点陡峭了,所以我希望在继续使用IDispatch之前先掌握所有这些内容。
我正在阅读Dale Rogerson撰写的“Inside COM”一书,并完成了有关EXE服务器的章节(下一章将介绍自动化)。
“EXE中的服务器”一章提供了实现服务器和客户端的示例代码。但是必须手动启动服务器。这让我很困惑。显然,当我的应用程序(=服务器)被客户端进程使用时,不需要这个额外的手动步骤。是否没有自动启动服务器的机制? 或实现这一目标是否需要自动化?目前,不得不手动启动我的服务器(一旦我有一台),我怀疑自己是朝着正确的方向前进。
希望对此有更多了解的人可以看到我缺少的信息,并指出我正确的方向。
答案 0 :(得分:1)
不,COM服务器通常不是手动启动的。不知道为什么本书提出它,可能是因为它想避免谈论允许COM自动启动EXE所需的注册表项。它不是非常复杂,您使用LocalServer32键值注册应用程序的Application coclass,并给出EXE的路径。
然而,这并非完全不常见,特别是对于现有的程序。要做出的一个设计决定是,您是否让客户端代码完全控制您的程序。或者,如果您的程序已有现有用户界面,但您还希望将服务公开给其他代码。在后一种情况下,让用户手动启动应用程序是有意义的,就像她通常那样。
答案 1 :(得分:1)
当您的应用程序注册为LocalServer32
时,如果没有正在运行的进程已为您的CLSID注册了工厂对象,则将使用其中指定的命令行调用它。
这样,您可以充分利用这两个方面 - 如果应用程序已经运行,则此实例可以提供服务器端,如果不是,则会启动它。
自动化与此完全正交 - 通过实施IDispatch
,您的组件变得与自动化兼容。