2009-09-25 120 views
1

我有一个应用程序和两个Dll。这两个库都由应用程序加载。我没有应用程序的来源,但是这些库的来源。我想实例化LIB A类和希望C++如何在应用程序的DLL之间进行通信?

如何做到这一点也使用这个实例中LIB B.?我不确定,但我认为这两个库都用在应用程序的不同线程中。

我不知道要在哪里搜索解决方案。

+0

通过使用第三个知道双方通信的库是否可能?像头文件都使用相同的目标代码? – plucked 2009-09-25 16:31:03

+0

我仍然有问题。我用Visual Studio 2008设置了一个示例解决方案。有一个加载两个dll(插件和代理)的主机应用程序。我希望从插件类中的代理主机应用程序实例不更改主机应用程序中的代码。 http://vs156212.vserver.de/DLLCommunication。zip – plucked 2009-09-25 23:02:19

回答

1

否。将DLL视为正常库。两者都可以在单个线程中使用。
如果要在库X中使用类A,则必须将指针/引用传递给它。这同样适用于库Y.这样,两个库都可以使用相同的类/数据。

+0

但是我如何传递这个指针? – plucked 2009-09-25 16:21:49

+0

作为函数参数? – 2009-09-25 16:30:32

+0

但是哪里?我只有源代码库,而不是初始化完成的应用程序。 – plucked 2009-09-25 16:32:47

0

命名管道可能是解决您的问题。

如果你靶向窗口,你可以检查this参考

[编辑]没有看到你想在同一实例工作。在这种情况下,你需要共享存储空间,但是,你真的要知道自己在做什么,因为它是相当危险的:) 一个更好的解决办法是采用面向对象的网络原则,以你的库和沟通,说CORBA,使用进程间中间件或127.0.0.1回送接口(防火墙需要允许这个)。

+0

问题是我必须在实时渲染中共享大量数据应用程序,并不希望减慢这个应用程序的工作,如“打包数据”...“提取数据”等等 共享内存看起来不错,我必须阅读有关它(o: – plucked 2009-09-25 16:26:35

+0

这些所有听起来都像跨进程解决方案 - 跨越一个dll边界的过程并不需要这种级别的复杂化 – morechilli 2009-09-25 16:38:57

+0

最初的提问者说他​​没有控制托管应用程序,在这种情况下,这两个DLL将不得不做所有的事情协调自己,命名管道或共享内存听起来像是一个很好的想法,即使它们通常不用于进程内通信。 – 2009-09-25 17:04:55

1

两个DLL加载到相同的过程是一个相当简单的设置。 你只需要小心模块范围,这将与dll范围相同。 例如每个dll对于任何静态对象都有自己的一组静态实例。 接下来,您需要了解如何跨边界引用函数/类,以及哪些类型可以安全地用作参数。

有对DLLEXPORT和dllimport的任何文件一看 - 有在这个网站几个有用的问题,如果你有这些字词的搜索。

0

似乎简单的解决方案将是在库A的一些初始化功能包括(的DllMain或如果需要的话)在库B中的简单的调用一个函数指针传递到公共对象。唯一需要注意的是,您必须确保该对象被删除了新的DLL,以避免堆管理器出现问题。

如果这些DLL的其实都是在不同的线程中使用您可能需要保护访问使用某种互斥的上述数据结构。

1

你必须认识到,即使你的DLL是由宿主应用程序没有使用阻止你(这是你的DLL)中使用您的DLL文件也是如此。所以在你的DLL A中,你可以加载和使用你的DLL B并调用函数和东西。当DLL A被卸载时,免费DLL B也是如此。 DLL是引用计数,所以你的DLL A将有1(主机应用程序)和你的DLL B 2(主机应用程序和DLL A)的引用。您不会在同一个进程中加载​​两个DLL B实例。

+0

我仍然有这个问题。我用Visual Studio 2008设置了一个示例解决方案。有一个加载两个dll(插件和代理)的主机应用程序。我希望从插件类中的代理主机应用程序实例不更改主机应用程序中的代码。 vs156212.vserver.de/DLLCommunication.zip – plucked 2009-09-25 23:34:06

+1

OIC。你将不得不修改代理类中的构造函数来调用插件DLL中的函数,并将其传递给它。您必须小心: 1.您正在传递指向不完整传球的指针。不要在这个功能上做任何事情。 2.该类是由主机应用程序创建并处理的。这意味着你不能删除它(因为它在别人的堆中),它可以随时被主机应用程序删除(也可以更改析构函数)。 让它保存线程。 – Fozi 2009-09-27 13:50:25

+0

糟糕:s/pass/class / – Fozi 2009-09-27 13:52:19

相关问题