首页 文章

注册免费Com和DLL清单

提问于
浏览
10

我正在尝试设置免注册COM,但有一个小问题,我可能是另一个COM对象客户端 .

App.exe -----> COM服务器/客户端DLL(已注册与否)--------> COM服务器DLL(未注册)

我的问题是,是否可以为第二个dll(COM服务器/客户端DLL)创建清单?我无法控制可执行文件,但如果我这样做,如果我为可执行文件创建客户端清单并为COM服务器dll创建服务器清单,则此方法有效 .

这是中间dll的清单文件 . 我尝试嵌入它并在外部尝试它 . 仍然无法正常工作 .

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" 
                    name="COMCliSer.dll" 
                    version="1.0.0.0" 
  />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity 
                     name="COMSer.dll" 
                    version="1.0.0.0"                    
      />
    </dependentAssembly>
  </dependency>
</assembly>

在进一步的调查中,只要中间dll也是免费注册并且exe有一个应用程序清单,我就可以全部工作 . 一旦我注册了中间的dll,并删除了应用程序清单(我无法控制exe将使用我的dll),整个过程就停止了 .

如果exe没有清单,那么不会考虑dll的清单 . 我可以通过设置一切工作来证明这一点 . 然后在程序集清单中输入错误 . 这会弹出通常的消息:

Unable to create process: This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

如果我然后删除应用程序清单,则应用程序加载(尽管CoCreateInstance失败,因为不考虑依赖关系)

1 回答

  • 5

    只需将一个程序集依赖项添加到指向com服务器dll的服务器/客户机DLL的清单中 .

    请记住,程序集清单与“应用程序”清单不同:程序集清单描述程序集:为其命名,并列出其dll . 应用程序清单是RT_MANIFEST嵌入式资源,它描述了当前模块的依赖关系 .

    所以,归根结底,你会得到:

    • app.exe,带有外部(app.exe.manifest)或嵌入式RT_MANIFEST,描述了对程序集的依赖关系'acme.clientserver'

    • acme.clientserver.manifest描述一个程序集,并将'clisrv.dll'列为免费注册com dll .

    • clisrv.dll,带有外部(clisrv.dll.2.manifest)或嵌入式RT_MANIFEST,描述了对程序集的依赖性'acme.server'

    • acme.server.manifest,描述一个程序集,将serv.dll列为免费注册com dll .

    • serv.dll - 可能或者可能不具有清单列出更多依赖程序集 .

    在技术上可以通过dll的名称调用程序集,并将程序集和dll清单合并在一起 - win32加载程序支持这一点,但是某些在应用程序清单中有效的设置在程序集清单中无效,这可能导致结果装配无法加载 . 这也使得数字签名变得非常困难 .


    WR必须有一个清单:通常exe的清单设置进程默认激活上下文 . 当exe没有清单时,我不是百分之百确定windows的行为,但我很确定dll中的清单仍然会被处理 .

    这意味着问题归结为CoCreateInstance缺乏隔离支持 - 出于某种原因 - 默认情况下 - CoCreateInstance仅查找reg free com条目的默认激活上下文 .

    覆盖它的方法是使用Activation Context API手动构建自己的激活上下文

    基本方法是调用:

    • CreateActCtx - 从dll清单中创建激活上下文 .

    • ActivateActCtx - 激活上下文

    • CoCreateInstance - 现在将搜索当前激活上下文以获取reg free com条目 .

    • DeactivateActCtx - 恢复默认激活上下文 .

    您可以添加/ D ISOLATION_AWARE_ENABLED来包装受激活上下文影响的大多数Windows调用,由于某些原因CoCreateInstance未被包装:/

相关问题