C++ Reg free COM进程外EXE

C++ Reg free COM进程外EXE,c++,com,manifest,out-of-process,registration-free-com,C++,Com,Manifest,Out Of Process,Registration Free Com,我有几个组件(多个.dll,一个.exe),我需要免费注册。在我的sxs清单中,我将dll文件列为 <file name="xxx.dll" <comClass description="xxx component" clsid="{xxx-xxx}" threadingModel="Apartment" /> </file> 这是一个太远的桥梁…无法尝试通

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

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

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

  • 使用所有正确的命令行选项调用CreateProcess()
  • 对进程调用WaitForInputId()
  • 打电话
  • 如果您使用的接口是自定义的,那么您可能还必须为它们设置条目。如果可能的话,我可能会建议让它们与IDispatch兼容

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


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

    这是一个太远的桥…无法尝试通过清单来完成。但是,您可以手动执行此操作。但是,你必须做的是操作系统所做的。你必须:

  • 使用所有正确的命令行选项调用CreateProcess()
  • 对进程调用WaitForInputId()
  • 打电话
  • 如果您使用的接口是自定义的,那么您可能还必须为它们设置条目。如果可能的话,我可能会建议让它们与IDispatch兼容

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

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