首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以将免费注册COM应用于DLL吗?

可以将免费注册COM应用于DLL吗?
EN

Stack Overflow用户
提问于 2014-04-02 00:07:41
回答 1查看 612关注 0票数 6

目前,对于免费注册的COM设置,我有这样的内容:

  • a.exe (依赖于b.dll;不直接依赖于c.dll)
  • a.exe.manifest (声明为c.dll免费注册)
  • b.dll (依赖c.dll )。例如,.NET TMBIMP生成COM包装器)
  • c.dll (一些COM实现DLL)
  • c.dll.manifest (c.dll的免注册COM清单)

是否有可能更改此方案,使a.exe上的清单被放置在b.dll上?如果可能的话,我希望其他程序能够引用b.dll,而不必在任何地方添加额外的清单。

(a.exe.manifest具有以下内容:

代码语言:javascript
复制
  <file name="msdia110.dll">
    <comClass description="Debug Information Accessor" clsid="{761D3BCD-1304-41D5-94E8-EAC54E4AC172}" threadingModel = "Both"/>
  </file>

)

c.dll.manifest是使用清单工具mt.exe生成的。(而且太长了,不能包括在这里)

EN

回答 1

Stack Overflow用户

发布于 2014-04-29 10:01:11

我的经验是,它不起作用,或者更确切地说,您需要调用Activation API来实际使用DLL中的清单:参见这个问题:Move manifest file to dll?

我对此的看法,虽然可能不完全准确,但以下是:

  • 基于注册表的COM是每个用户的“全局”。
  • Regfree清单COM是每个进程的“全局”,应该在可执行文件上进行管理。

只有可执行清单总是“在作用域中”,如果您是DLL,则必须使用Activation显式地加载这个清单,而问题是,只有当您确切知道需要它的时间并控制调用路径到DLL中需要它的位置时,它才能工作。

因为,正如我所理解的,当您拥有"a.exe.manifest (声明c.dll的无注册COM注册)“时,您真正要做的是修改该过程的初始/全局激活上下文。这个(似乎)只适用于可执行的清单。在DLL加载之后,DLL的任何清单都不会自动使用,所以当您需要在适当的位置(即在CoCreateInstance之前)使用reg免费COM清单时,您必须手动地使用它。

I had a case中,我认为我知道什么时候调用了CoCreateInstance,我需要这个开关,但后来发现DLL产生了一些线程,这些线程本身执行了一些CoCreateInstance任务。(在这里,我无法控制.)

总之,我想说:

  • 如果您可以这样做,请将SxS COM清单包含在可执行文件中。
  • 如果您完全知道并能够控制何时切换上下文(“手动”),您可以使用Activation,但是与仅仅在可执行文件中嵌入清单相比,这似乎要麻烦得多。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22799232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档