我正在尝试设置免注册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 回答
只需将一个程序集依赖项添加到指向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未被包装:/