1

我打算将 COM 接口添加到现有应用程序(顺便说一下,它是使用 Win32 用 C++ 编写的)。我有一些使用COM 对象的经验,所以我知道接口等基本 COM 概念,但这是我第一次真正实现组件。

最终,我希望能够使用 COM 接口通过 VB 等脚本自动化我的应用程序。我知道有两个步骤:

  1. 我的应用程序必须充当进程外服务器(即我必须使用 MIDL 并为代理 DLL 和存根 DLL 生成代码)。
  2. 拥有服务器后,我可以通过实现 IDispatch 接口来添加自动化功能。

由于带有 MIDL 的服务器在一个 EXE 中以及其他的东西已经有点陡峭,我想在继续 IDispatch 之前先掌握所有这些。

我正在阅读 Dale Rogerson 的《Inside COM》一书,并完成了关于 EXE 中服务器的章节(下一章将介绍自动化)。

“EXE 中的服务器”一章提供了实现服务器和客户端的示例代码。但是需要手动启动服务器。这让我很困惑。显然,当客户端进程使用我的应用程序(= 服务器)时,不需要这个额外的手动步骤。是否没有自动启动服务器的机制?或者是否需要自动化来实现这一目标?目前,不得不手动启动我的服务器(一旦我有一个)的前景让我怀疑我是否朝着正确的方向前进。

希望对此有更多了解的人可以看到我缺少哪些信息并为我指明正确的方向。

4

2 回答 2

1

不,COM 服务器通常不是手动启动的。不确定这本书为什么提出它,可能是因为它想避免谈论允许 COM 自动启动 EXE 所需的注册表项。否则它不是很复杂,您使用 LocalServer32 键值注册应用程序的应用程序 coclass,该键值提供 EXE 的路径。

然而,这并非完全不常见,尤其是对于现有程序。要做出的一个设计决定是您是否让客户端代码完全控制您的程序。或者,如果您的程序已经有一个现有的用户界面,但您还想向其他代码公开服务。在后一种情况下,让用户手动启动应用程序是有意义的,就像她通常做的那样。

于 2012-10-18T17:38:08.187 回答
1

当您的应用程序注册为LocalServer32时,如果尚未运行的进程为您的 CLSID 注册工厂对象,它将使用此处指定的命令行调用。

这样,您可以两全其美——如果应用程序已经在运行,则此实例可以提供服务器端,如果没有,它将启动。

自动化与此完全正交——通过实施,您的组件变得与自动化兼容IDispatch

于 2012-10-18T17:39:12.913 回答