visual-c++ - 如何使用COM在两个进程之间传输数据(用于IPC-进程间通信)

标签 visual-c++ com atl

我对 COM 有一般的了解,并且想了解 COM 如何帮助数据传输。假设有两个进程,进程-A 和进程-B,并且他们都希望彼此共享一些数据,当然有很多 RPC 机制,但我想使用 COM。

  • 您不能创建 COM dll,因为它会特定于进程并且无法使用
  • 我们可以创建一个单吨 COM EXE 服务器并将结构包装在 COM CoClass 中并将其成员公开为属性然后......不知道如何?

  • 以上是我的理解,有没有大佬能帮我理一下这个话题?基本上我想使用 COM 在两个进程之间共享数据结构

    最佳答案

    COM exe进程外服务器特别难写,但微软已经创建了COM+ Component service来缓解这种情况。

    它包含许多服务,但在这里我们对允许您在进程外代理主机中托管进程内服务器 (DLL) 的应用程序服务感兴趣。

    这很简单,只需编写一个标准的 ATL DLL(或使用您喜欢的任何其他语言/框架)。我建议对接口(interface)使用自动化类型,因此您不需要特殊代理,例如使用如下定义的 IDL 接口(interface):

    interface ISharedMap : IDispatch{
        [id(1)]
        HRESULT PutData([in] BSTR key, [in] VARIANT value);
    
        [id(2)]
        HRESULT GetData([in] BSTR key, [out, retval] VARIANT *pValue);
    };
    

    然后创建一个新的 COM+ 应用程序,如下所述:Creating COM+ Applications ,并将其声明为服务器应用程序。这是完成后您应该看到的内容:

    enter image description here

    您的 DLL 现在将自动托管在特定进程(著名的 dllhost.exe)中,该进程将在客户端尝试连接时立即启动。默认情况下,相同的进程将用于各种进程外 COM 客户端。它会在一段时间后关闭,但您可以通过多种方式配置 COM+ 应用程序,例如设置“空闲时保持运行”标志:

    enter image description here

    现在,您将能够为您喜欢的所有 COM 客户端使用跨进程内存缓存,例如,像这样来自一个简单的 javascript .js 代码:
    var map = new ActiveXObject("SharedMap");
    map.PutData("mykey", "mydata")
    var data = map.GetData("mykey")
    

    注意:缓存的实现留给读者,但它可以重用另一个 COM+ 服务:COM+ Shared Property Manager

    关于visual-c++ - 如何使用COM在两个进程之间传输数据(用于IPC-进程间通信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096671/

    相关文章:

    visual-studio - 为 COM 互操作注册 x64 程序集

    com - 如何从不同的公寓模型访问 COM 对象?

    c++ - 什么情况下 Internet Explorer 无法正确卸载 ActiveX 控件?

    delphi - 如何将 IAutoComplete 与 TStringsAdapter 一起使用?

    c# - 为 ProgId 动词运行命令

    c++ - CComSafeArray MultiDimSetAt 是否制作引用元素的拷贝?

    c++ - 缺少 MSVCP100D.dll

    c++ - 将非常大且旧的 C++Builder 代码移植/重新编码到 Qt 或 CLI/Mono

    c++ - 禁用某些方法的 Visual C++ 虚函数覆盖警告

    c++ - 在 VC11 中启用/禁用 SAFESEH?