【问题标题】:Communication between two DLLs within the same process同一进程内两个 DLL 之间的通信
【发布时间】:2009-07-31 10:18:11
【问题描述】:

我有一个加载“aaa.dll”的应用程序。 “aaa.dll”加载另外两个dll“bbb.dll”和“ccc.dll”。

aaa.dll 是第三方 dll,不是我自己写的。但是bbb.dll和ccc.dll都是我写的。

bbb.dll 和 ccc.dll 有什么方法可以相互通信吗?指向任何资源都会很有帮助。

通信类型:我需要将设置或未设置的状态从 bbb.dll 发送到 ccc.dll。

谢谢大家。 LoadLibrary()/GetProcAddress 成功了。我想确保 bbb.dll 不会加载 ccc.dll 的第二个副本。此外,对于我需要的是进程内通信来说,进程间通信似乎有点过头了。

再次感谢大家。

【问题讨论】:

  • 通过使用 GetModuleHandle 函数,您可以检查是否加载了 DLL。再次加载 DLL 不是问题 - 它只是一个 refcounter 增量。也为了共享一种状态而不是创建一个新的导出函数,我只会使用 Event - 它会容易得多。

标签: winapi dll visual-c++


【解决方案1】:

DLL 不通信。课堂交流。想想需要相互交流的类,答案就会清楚得多。

【讨论】:

    【解决方案2】:

    您可以进行直接 API 调用。它在同一进程中,因此静态对象也将被共享。

    【讨论】:

      【解决方案3】:

      您可以使用任何广泛的 Win32 IPC 东西 - 共享内存、互斥体、事件等。详细说明您需要什么样的通信,论坛将为您提供更具体的建议。

      【讨论】:

        【解决方案4】:

        ccc.dll 应该导出一个“SetState”函数。然后 bbb.dll 可以在需要时调用所述函数。您需要静态或通过 LoadLibrary/GetProcAddress 将 bbb.dll 链接到 ccc.dll。

        【讨论】:

          【解决方案5】:

          您需要第三个程序集来充当两者之间的接口。此接口程序集将导出其他两个程序集相互通信所需的所有必需对象和/或方法。

          下面这个例子当然是以 .NET 作为平台,但同样的概念也可以用在 Win32/C++ 项目中。

          就架构而言,这有点难。 .NET 中的两个 DLL 不能直接以 two 的方式进行通信而没有一些开销,但是,您可以通过 one 的方式进行通信。原因是您只能从另一个程序集引用一个程序集,否则您将获得循环引用。

          虽然有一个简单的解决方案,但这需要您的三个组件。采取以下程序集:

          • Interface.dll
          • Client.dll
          • Server.dll

          仅通过名称,您应该能够很好地了解其工作原理。基本上,Interface.dll 将包含 Client.dll 和 Server.dll 需要相互通信的公开对象。 Client.dll 和 Server.dll 都会引用 Interface.dll 来访问这些对象。

          使用该方法,两个程序集都可以访问任何一个需要通信的所有对象。 Interface.dll 还将包含 Client.dll 和 Server.dll 都需要通信的公开方法。因此它可以包含例如 Client.dll 或 Server.dll 可以使用的“Send”和“Receive”方法。

          您必须为此制定某种通信标准。

          • 这些程序集将如何相互通信?
          • 这些程序集将如何通信?

          说到这两个,无论您是在传达实际的类和对象还是只是消息,只要您在架构和设计上付出努力,第三个处理这个问题的程序集就可以完美地工作。

          不要把名字放在心上,Client.dll、Server.dll 和 Interface.dll 都只是如何完成此类任务的常用方法的示例。使用这种方法,将没有循环引用,因此您的程序集可以通过两种方式进行通信,而不是一种。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-30
            • 2013-07-16
            • 2011-04-13
            • 2020-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-05
            相关资源
            最近更新 更多