将COM接口添加到现有应用程序(EXE)

时间:2012-10-18 17:03:38

标签: com out-of-process

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

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

  1. 我的应用程序必须充当进程外服务器(即我必须使用MIDL并为代理DLL和存根DLL生成代码)。
  2. 一旦拥有了服务器,我就可以通过实施IDispatch接口来添加自动化功能。
  3. 由于MIDL中的服务器在EXE中的东西已经有点陡峭了,所以我希望在继续使用IDispatch之前先掌握所有这些内容。

    我正在阅读Dale Rogerson撰写的“Inside COM”一书,并完成了有关EXE服务器的章节(下一章将介绍自动化)。

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

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

2 个答案:

答案 0 :(得分:1)

不,COM服务器通常不是手动启动的。不知道为什么本书提出它,可能是因为它想避免谈论允许COM自动启动EXE所需的注册表项。它不是非常复杂,您使用LocalServer32键值注册应用程序的Application coclass,并给出EXE的路径。

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

答案 1 :(得分:1)

当您的应用程序注册为LocalServer32时,如果没有正在运行的进程已为您的CLSID注册了工厂对象,则将使用其中指定的命令行调用它。

这样,您可以充分利用这两个方面 - 如果应用程序已经运行,则此实例可以提供服务器端,如果不是,则会启动它。

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