c++ - _MERGE_PROXYSTUB 有什么意义?

标签 c++ com atl

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

代理/ stub 有什么意义?如果我不选择合并选项,那么我会得到一个单独的 MyControlPS.DLL - 什么时候可以使用它?

FWIW 如果我删除 _MERGE_PROXYSTUB 定义包围的所有代码,控件似乎可以注册并正常工作。调试版本甚至没有定义 _MERGE_PROXYSTUB,它仍然可以正常工作。

那么,我可以不用代理/ stub 吗?

最佳答案

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

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

如果违反这些规则,COM 将抛出异常或返回失败 HRESULT,例如 RPC_E_WRONG_THREAD

如果您不选中合并代理/ stub 选项,则 visual studio 会为代理/ stub 生成一个单独的项目,并将其构建到一个单独的 dll 中。如果需要,这会使部署变得更加困难,但如果您不受线程模型问题的影响,基本上可以忽略它们。

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

拉里·奥斯特曼 (Larry Osterman) 对 threading models 进行了可读性介绍在他的博客上。

关于c++ - _MERGE_PROXYSTUB 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444388/

相关文章:

C++——msvc2012下的Qt+v8

c++ - 正则表达式 - 条件替换

c++ - BFS 实现无法正常工作

c++ - 无法编译 Microsoft COM/ActiveX 示例

c++ - Win8 的拼写检查 API 将 null 作为输出参数发送

c++ - 更少的恒定时间迭代花费更多时间-C++编译器依赖项?

c# - PowerShell 中的“无法转换 "System.__ComObject"值 ...”错误

delphi - 识别/列出来自第三方软件的 COM 对象和属性

c++ - 为什么我的 DCOM 客户端会锁定对 SendMessage 的调用?

c++ - 无法弄清楚如何在 Win32 对话框中托管 Web 浏览器(例如 IWebBrowser2)。 ATL 还行,没有 MFC