代码之家  ›  专栏  ›  技术社区  ›  Rob

合并代理服务器有什么意义?

  •  11
  • Rob  · 技术社区  · 15 年前

    我使用VS2008生成了一个ATLCOM对象,代码包含对名为 _MERGE_PROXYSTUB (因为我在最初运行向导时选择了“合并代理/存根”选项。)

    代理/存根的意义是什么?如果我不选择合并选项,那么我会得到一个单独的 MyControlPS.DLL 相反-什么时候会用到这个?

    fwiw如果删除由 _合并代理服务器 定义。调试生成甚至没有定义 _合并代理服务器 它仍然可以正常工作。

    那么,我可以不使用代理/存根吗?

    2 回复  |  直到 15 年前
        1
  •  15
  •   John Sibly    15 年前

    如果希望使用与COM对象不同的线程模型从应用程序调用COM对象,则需要代理/存根。

    例如,我们有一个插件,该插件由使用特定线程模型的应用程序加载(不记得是哪个),但我们的COM对象是多线程单元(MTA),因此在进行函数调用时,代理/存根需要整理对象之间的数据,同时还要遵守线程模型的规则。

    如果这些规则被破坏,那么COM将抛出异常或返回一个失败的hresult,例如 rpc-e-u错误的线程

    如果不选中“合并代理/存根”选项,则Visual Studio将为代理/存根生成一个单独的项目,该项目将生成一个单独的dll。如果需要的话,这会使部署更加困难,但是如果不受线程模型问题的影响,基本上可以忽略它们。

    因此,如果调用COM对象的应用程序使用与对象相同的线程模型,则可以不使用代理/存根。

    Larry Osterman对 threading models 在他的博客上。

        2
  •  3
  •   Kim Gräsman    15 年前

    此外,如果您的接口只包含类型库友好类型(BSTR、variant等),并且出现在IDL的库块中,则可以选择将它们“类型库编组”,这意味着系统提供的代理/存根使用类型库中的元数据。

    当接口被放入库块中,并且dllRegisterServer被自定义为注册类型库时(如果我正确调用,则将true传递给xxxmodule::dllRegisterServer),系统将根据John Sibly的描述对您的接口进行编组(如果需要)。

    此时,代理/存根甚至都没有使用,所以 _MERGE_PROXYSTUB 没有效果。