同一进程中两个DLL之间的通信

时间:2009-07-31 10:18:12

标签: winapi dll visual-c++

我有一个加载“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的第二个副本。同时,进程间通信对我所需要的是进程内通信似乎有点过分。

再次感谢大家。

5 个答案:

答案 0 :(得分:4)

DLL不通信。课程沟通。想想需要相互沟通的课程,答案会更加明确。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您可以使用任何广泛的Win32 IPC内容 - 共享内存,互斥,事件等,提供您需要的通信类型的更多详细信息,论坛将为您提供更具体的建议。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

您需要第三个程序集作为两者之间的接口。此接口程序集将导出两个其他程序集之间所需的所有必需对象和/或方法。

以下示例当​​然将.NET视为平台,但在Win32 / C ++项目中可以使用相同的概念。

在架构方面,这是一个艰难的问题。 .NET中的两个DLL无法直接通信两种方式而无需一些开销,但是,您可以通过一种方式进行通信。原因是你只能从另一个组件引用一个组件,否则你将有一个循环引用。

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

  • 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可以使用的“发送”和“接收”方法。

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

  • 这些组件之间的相互沟通是什么?
  • 这些组件如何进行通信?

说到这两个,无论你是在传递实际的类和对象,还是只传递消息,只要你付出了体系结构和设计的努力,第三个处理这个的程序集就可以完美地工作。

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