【问题标题】:Is it possible to communicate through a COM object?是否可以通过 COM 对象进行通信?
【发布时间】:2009-08-22 18:58:09
【问题描述】:

两个 exe 是否可以通过COM(ActiveX?)接口进行通信? COM DLL 可以协调 2 个独立进程之间的数据共享吗?

【问题讨论】:

  • 请注意“ActiveX”实际上只是营销。成为 ActiveX 控件的唯一真正要求是支持 IUnknown 并且可以进行 CoCreate。 IE 安全增强功能基本上也要求支持 IObjectSafety。但实际上 COM 对象和 ActiveX 控件之间没有区别。

标签: com interprocess


【解决方案1】:

如果要在两个进程之间进行通信,请使用named pipe

(可以通过这种方式调用远程 COM 对象并共享数据,但它过于复杂。)

【讨论】:

    【解决方案2】:

    显然,你的问题的答案是肯定的。

    后续是:

    1. 为什么要共享数据?你想达到什么目的?数据是什么样的?您是否需要编组复杂的结构并进行复杂的 RPC 调用,或者您是否只是在内存中拥有大量数据并且想要让两个人参与其中?
    2. 为什么您认为 COM 是最好的方法?您是否考虑过仅发送窗口消息,或使用命名管道(如@avakar 建议的那样),或使用具有命名互斥锁的共享内存?

    #1 的答案将通知#2。

    但可以说 COM 是最适合您的解决方案。如果您在进程 A 中有一些代码想要在进程 B 中执行某些操作,则在 b.exe 中注册一个 COM 对象,然后让进程 A CoCreateInstance() 成为该对象。 COM 将启动 b.exe,创建由您传递给 CoCreateInstance() 的 CLSID 指定的对象,然后给您一个指向您在 CoCreateInstance() 的 IID 参数中请求的指定接口的指针。现在您可以从进程 A 调用进程 B 中对象的方法。

    如果您还有其他问题或澄清,请随时跟进。

    COM 将为您编组基本数据类型(基本上是 VARIANT 支持的所有内容)。

    【讨论】:

      【解决方案3】:

      您可以查看Sharing the CoffeeMonitor 以获得用VB6 编写的简单示例。不过,这对于 n 向通信可能最有用,而不是简单的一对一场景。

      另一种方法可能是使用Mailslots,它与命名管道不同,它可以以类似于 UDP 广播的方式使用广播。

      【讨论】:

        【解决方案4】:

        com dll 可以协调 2 个独立进程之间的数据共享吗?

        注意:该 DLL 将有两个实例,每个进程中都有一个。如果 DLL 拥有/管理数据,则 DLL 的每个实例都有自己的数据:这些数据不会在进程之间共享。

        两个 exe 可以通过一个 com 接口进行通信,其中 COM 接口支持像 putData 和 @987654322 这样的方法,我不知道@,但是我认为您可能希望将此 COM 对象构建/打包/安装为进程外 (*.exe) COM 对象,而不是进程内 (*.dll) COM 对象。

        或者,如果您确实使用 DLL,则必须实现它们以应对它们的两个单独实例:例如它应该使用跨进程互斥体而不是进程内临界区,以及跨进程共享内存而不是进程内私有堆内存。

        这可能不是协调数据共享的最佳方式,但它可能是一种方式。

        【讨论】:

          【解决方案5】:

          是的,两个 exe 可以通过 COM 接口进行通信。

          COM 客户端和 COM 服务器可以在同一个进程中,在 同一台计算机或两台计算机上的两个独立进程 不同的电脑。

          【讨论】:

            【解决方案6】:

            DCOM(分布式 COM)是与运行在单独进程(甚至机器)中的 COM 对象进行通信的技术。虽然如果您详细说明您的场景会有所帮助,但对于您正在尝试做的事情可能会有更好的选择。

            【讨论】:

              猜你喜欢
              • 2020-06-16
              • 1970-01-01
              • 2020-02-05
              • 1970-01-01
              • 1970-01-01
              • 2012-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多