【问题标题】:Out-of-process COM server without a proxy/stub DLL?没有代理/存根 DLL 的进程外 COM 服务器?
【发布时间】:2012-10-10 19:09:20
【问题描述】:

我正在学习如何实现进程外 COM 服务器,并偶然发现了这篇代码项目文章 Building a LOCAL COM Server and Client: A Step by Step Example

我可以构建它,它运行良好,但是代理/存根 DLL 在哪里?我所能看到的只是 IDL 文件,在构建期间从中生成代理/存根代码。但是 DLL 是如何构建的,它在哪里呢?

【问题讨论】:

    标签: winapi com rpc out-of-process


    【解决方案1】:

    简短的回答是所有接口都标记为“oleautomation”,因此 oleaut32.dll 执行编组,因为 COM 知道如何编组接口中使用的所有类型。

    如果缺少“oleautomation”,或者指定的类型默认 COM 不知道如何编组 (see the list here),则需要您的非默认编组器及其存根。

    【讨论】:

      【解决方案2】:

      您需要 Proxy/Stub 项目来帮助 COM 编组您的接口。当您使用 Visual Studio 创建 ATL C++ 项目时,通常会自动创建一个带有 PS 后缀的辅助项目,这就是您的代理/存根 DLL。但是,如果没有它,你可能会做得很好(我个人从来不需要构建和使用它,即使我确实必须处理诸如自定义编组之类的事情)。如果您在项目中提供类型库,则它已注册并满足某些条件 - COM 将为您提供自动代理/存根对。

      额外阅读:

      【讨论】:

      • 好的,谢谢。我会阅读您提供的链接,并且由于代理/存根 DLL 似乎是可选的,因此我会考虑回答问题。能推荐一些学习COM的书吗?我有 Dale Rogerson 的 Inside COM,我认为它在解释进程内服务器方面做得非常好,但是当它涉及到 EXE 中的服务器时就有点肤浅了。
      • 我认为这是我读过的唯一一本关于 COM 的书,而且我认为它很好。我必须立即提供任何其他建议,我想一个人只需要基础知识就可以做得很好,并且仔细地制定步骤,了解自己在做什么。 EXE 服务器与进程内服务器并没有太大区别,所有 API 在 MSDN 上都有详细记录。
      • 没那么简单,你还是要注册HKCR\Interface\{iid}\ProxyStubClsid32和TypeLib键,才能得到使用类型库的标准编组器。 CLSID 是 {00000320-0000-0000-C000-000000000046}。如果你不这样做并且它仍然有效,那么你很有可能通过不编组接口指针来违反公寓规则。
      • @HansPassant:你不需要自己做,它通过常规类型库注册“免费”提供,前提是接口本身是dual(和/或oleautomation - 不是当然)。
      • 不,如果不添加这些键,COM 无法从接口 IID 中找到类型库。
      猜你喜欢
      • 2011-11-20
      • 2014-02-18
      • 2013-01-20
      • 2012-09-06
      • 1970-01-01
      • 2011-07-29
      • 2011-01-23
      • 2023-03-25
      • 2015-05-23
      相关资源
      最近更新 更多