免注册Com和dll清单

免注册Com和dll清单,com,manifest,registration,Com,Manifest,Registration,我正在尝试设置免注册COM,但有一个小问题,我发现另一个COM对象可能是客户端 App.exe------->COM服务器/客户端dll(已注册或未注册)--->COM服务器dll(未注册) 我的问题是,是否可以为第二个dll(COM服务器/客户端dll)创建清单?我没有对可执行文件的控制权,但如果我控制了,那么如果我为可执行文件创建了客户机清单,并为COM服务器dll创建了服务器清单,那么这就行了 这是中间dll的清单文件。我试着嵌入它,并尝试它的外部。还是不行 <?xml versio

我正在尝试设置免注册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的清单。我可以通过设置一切工作来证明这一点。然后在程序集清单中输入错误。这会弹出通常的消息:

无法创建进程:由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题。


如果我随后删除应用程序清单,应用程序将加载(尽管CoCreateInstance失败,因为没有考虑依赖项)

只需向服务器/客户端dll的清单添加指向com服务器dll的程序集依赖项即可

请记住,程序集清单不同于“应用程序”清单:程序集清单描述一个程序集:给它一个名称,并列出它的DLL。 应用程序清单是RT_清单嵌入资源,它描述了当前模块的依赖关系

因此,归根结底,你应该:

  • app.exe,带有外部(app.exe.manifest)或嵌入式RT_清单,描述对名为“acme.clientserver”的程序集的依赖关系
  • 描述程序集的acme.clientserver.manifest,并将“clisrv.dll”列为免注册com dll
  • clisrv.dll,带有外部(clisrv.dll.2.manifest)或嵌入式RT_清单,描述对名为“acme.server”的程序集的依赖关系
  • acme.server.manifest,描述程序集,将serv.dll列为无注册com dll
  • serv.dll-它可能有,也可能没有清单列出更多的依赖程序集
从技术上讲,可以按dll的名称调用程序集,并将程序集和dll清单合并在一起—win32 loader支持这一点,但某些在应用程序清单中有效的设置在程序集清单中无效,这可能导致生成的程序集无法加载。这也使得数字签名变得非常困难


WRT exe必须有一个清单:通常exe的清单设置进程的默认激活上下文。我不是100%确定当exe没有清单时windows的行为,但是我非常确定DLL中的清单仍然会被处理

这意味着问题归结为CoCreateInstance中缺少隔离支持——出于某种原因——默认情况下——CoCreateInstance只在默认激活上下文中查找无注册com条目

覆盖它的方法是使用

基本方法是调用:

  • CreateActX-从DLL清单创建激活上下文
  • ActivateActCtx-激活上下文
  • CoCreateInstance-现在将在当前激活上下文中搜索reg free com条目
  • DeactivateActCx-恢复默认激活上下文

您可以添加/D隔离\u-AWARE\u,以包装受激活上下文影响的大多数windows调用,因为某些原因,CoCreateInstance未包装://

我没有app.exe.manifest(注册中间com dll时不需要它)。我尝试将清单添加到中间dll,但没有效果。您是否在资源编辑器(例如visual studio)中打开了中间dll,并查看它是否具有RT_清单资源以及其中的内容?VS总是将RT_清单显示为十六进制,所以您需要将其导出以文本形式查看。好的,完成了。dll有两个RT_清单,一个我认为是由编译器(Delphi)将Windows公共控件命名为依赖项放在那里的,另一个是我添加的,显示在上面的.Ouch。我在使用VisualC++时,就如何在清单依赖关系中合并提出了很多建议。对于delphi,我无法帮助您:-您确实需要将依赖项信息与delphi的合并-delphi是否至少包含来自平台SDK的“mt.exe”工具?MT用途广泛,可以更新嵌入的清单,合并到其他清单中。如果我能合并他们,我就可以走了?我将检查mt.exe为什么要调用程序集
comser.dll
?程序集清单信息是否合并?部署具有描述性名称(例如“Microsoft.VC90.CRT”)的程序集要容易得多,该程序集包含具有不同名称的dll:“msvcr90.dll”。处理dll程序集时,调试变得更加困难,因为单个清单现在有两个用途:向使用者描述程序集的内容,以及描述程序集中dll的依赖项。名称已更改以保护无辜者!那些不是真名。这些是本机COM DLL,而不是.NET程序集。此外,“不工作”算什么?exe和第二个dll是否加载并未能实例化第三个dll,或者exe或第二个dll是否完全加载失败?让东西实际上无法加载是一个很好的步骤,因为这意味着