1

我有几个组件(多个 .dll,一个 .exe)需要免费注册才能使用。在我的 sxs 清单中,我将 dll 文件列为;

<file name="xxx.dll"
  <comClass
    description="xxx component"
    clsid="{xxx-xxx}"
    threadingModel="Apartment" />
</file>

我已经创建并激活了一个激活上下文,并且可以CoCreateInstance();毫无问题地调用这些 dll 组件。

但是,我还有一个需要运行的 COM 服务器单例(作为 .exe),我相信您只能将 dll 文件放在 sxs 清单中。我有它的 CLSID。

我受到限制,因为使用 regsvr 不是一个选项,所以有没有其他方法可以实现这一点?理想情况下,以编程方式在与我创建这些其他组件的位置相同的位置完成所有操作。

4

1 回答 1

0

那是一座太远的桥梁……无法尝试通过清单来实现。但是,您可以手动进行。但是,您必须做的是操作系统所做的。你必须:

  1. 使用所有正确的命令行选项调用 CreateProcess()
  2. 在进程上调用 WaitForInputIdle()
  3. 进行 COM 调用

如果它们是自定义的,您可能还必须为您使用的接口输入条目。如果可能的话,我可能会建议使它们与 IDispatch 兼容。

要知道需要哪些命令行选项,您必须在构建机器上注册服务器,然后查找 CLSID 的 LocalServer32 注册表项并查看参数是什么。如果它们是 MFC 或 ATL,它们可能会略有不同,但通常 ATL 参数总是相同的,除非您执行自定义操作。

如果由于某种原因 CreateObject() 失败,那么您可能必须在您创建的进程上调用 TerminateProcess() ,否则您将拥有一堆孤立的进程。如果成功创建对象,正常的 COM 引用计数应该足以自动关闭服务器进程。

于 2020-06-25T16:33:37.560 回答