2009-07-31 123 views
0

我有一个加载“aaa.dll”的应用程序。 “aaa.dll”加载另外两个dll“bbb.dll”和“ccc.dll”。同一进程中两个DLL之间的通信

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

bbb.dll和ccc.dll相互通信有什么办法吗?指向任何资源将非常有帮助。

通信类型:我需要发送一个状态设置或不是从bbb.dll到ccc.dll。

谢谢大家。 LoadLibrary()/ GetProcAddress做了诀窍。我想确保bbb.dll不加载ccc.dll的第二个副本。此外,进程间通信似乎是矫枉过正的,因为我需要的是进程间通信。

再次感谢大家。

+0

通过使用GetModuleHandle函数,您可以检查是否加载了DLL。再次加载DLL不是问题 - 它只是一个refcounter增量。也可以分享一种状态,而不是摧毁一个新的输出功能,我只是使用事件 - 这会容易得多。 – Andrey 2009-08-12 06:29:18

回答

1

ccc.dll应该导出一个'SetState'函数。只要需要,bbb.dll就可以调用该函数。您需要静态或通过LoadLibrary/GetProcAddress将bbb.dll链接到ccc.dll。

3

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

3

DLL不通信。类沟通。想想需要彼此交流的课程,答案会更加清晰。

3

您可以使用任何广泛的Win32 IPC的东西 - 共享内存,互斥体,事件等给予更多的细节,你需要什么样的沟通和论坛会给你更具体的建议。

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都只是这样一个任务可以完成的常用方法的例子。使用这种方法,将不会有循环引用,因此您的程序集可以通过两种方式进行通信,而不是一种。