App.exe —–> COM Server / Client dll(已注册或不注册)——–> COM Server DLL(未注册)
我的问题是,是否可以为第二个dll(COM Server / Client 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.
应用程序清单是RT_MANIFEST嵌入式资源,它描述当前的模块依赖关系.
所以归根结底,你会有:
> app.exe,具有外部(app.exe.manifest)或嵌入式RT_MANIFEST,描述了一个名为“acme.clientserver”的程序集的依赖关系
> acme.clientserver.manifest描述一个程序集,并列出“clisrv.dll”作为注册免费软件.
> clisrv.dll,具有外部(clisrv.dll.2.manifest)或嵌入式RT_MANIFEST,描述了一个名为“acme.server”的程序集的依赖关系
> acme.server.manifest,描述一个程序集,将serv.dll列为免费注册表.
> serv.dll – 它可能或可能不会再有一个清单列出更多的依赖程序集.
在技术上可以通过dll的名称调用程序集,并且将程序集和dll清单合并在一起 – win32加载程序支持这一点,但是在程序清单中有效的某些设置在程序集清单中无效,这可能导致结果装配失败.它也使得数字签名非常困难.
WRT的exe必须有一个清单:通常exe的清单设置进程默认激活上下文.我不是100%肯定当EXE没有清单时窗口的行为,但我很确定,dll中的清单仍将被处理.
这意味着问题归结为在CoCreateInstance中缺少隔离支持 – 由于某些原因 – 默认情况下,CoCreateInstance仅查看reg free com条目的默认激活上下文.
覆盖它的方法是使用Activation Context API手动构建您自己的激活上下文
> CreateActCtx – 从您的dlls清单创建激活上下文.
> ActivateActCtx – 激活上下文
> CoCreateInstance – 现在将搜索当前的激活上下文以获取免费的com条目.
> DeactivateActCtx – 恢复默认激活上下文.
您可以添加/ D ISOLATION_AWARE_ENABLED来包装由激活上下文影响的大多数Windows调用,由于某种原因CoCreateInstance不被包装:/
原文地址:https://www.jb51.cc/windows/363813.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。