【问题标题】:Is it possible to choose a manifest to use when starting a process in windows?在 Windows 中启动进程时是否可以选择要使用的清单?
【发布时间】:2013-09-10 04:36:44
【问题描述】:

我正在尝试提供一个 COM 对象,该对象可用于替代我无法控制的可执行文件中的对象。我用所有相同的接口创建了这个 COM 对象的实现。我希望能够仅偶尔使用此替换,因此我不希望它的注册替换原始对象。

我可以通过修改可执行文件的清单以在我的 dll 中查找 com 对象而不是通过注册表查找原始对象来让可执行文件加载我的 COM 对象而不是使用 reg-free COM 的原始对象。

到目前为止一切顺利。但是这样做需要修改可执行文件中的清单文件。我不希望此更改是永久性的,并且由于可执行文件通常安装在“程序文件”中,因此还需要管理员权限才能更改此文件。

理想情况下,我希望保持原始可执行文件不变。然后,当需要时,我创建的单独启动程序将使用重定向到我的 com 对象的清单加载请求的可执行文件,而不是可执行文件中的原始清单文件。

这样的事情可能吗?或者也许是一种更好的方式来做我想做的事情?

注意:我可能无法在我有写访问权限的位置制作清单更改的可执行文件的副本,因为我提前不知道这个可执行文件的所有依赖项将是什么(它可能需要来自同一目录的 dll,或来自子目录的数据文件)。我可以将修改后的可执行文件的工作目录设置为原始可执行文件的目录,但如果可执行文件根据其文件位置执行任何操作,它将中断。

【问题讨论】:

    标签: com manifest regfreecom reg-free


    【解决方案1】:

    我将在这里采取不同的方法并使用HKEY_CURRENT_USER\Software\Classes 重新创建原始 COM DLL 的注册表项以指向您的替代 DLL。此位置按用户执行,优先于HKEY_CLASSES_ROOT。一个单独的启动器可以做到这一点,不需要管理员权限。启动器应在退出时删除这些键。

    【讨论】:

    • 谢谢。我会这样做,但由于变化的持续性而有点犹豫。如果我的应用程序被终止、崩溃或计算机断电,那么更改是永久性的,直到我的应用程序再次运行并可以重置它。或者我需要让一个监控程序始终运行,看看是否需要重新设置。
    • 为了缓解意外崩溃的情况,您可以在 alternative DLL 中编写检查代码,以查看它是否被 您的 应用程序调用。如果不是,DLL 本身可以清理密钥并将其所有 COM 方法委托给原始 DLL。或者它可能会显示一条消息,要求重新启动应用程序(在清理密钥之后)并执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多