c ++中dll的多个实例

时间:2011-10-18 16:08:52

标签: c++ multithreading tcp dllimport

我有10.000台设备,我想通过一个c ++应用程序来控制它们。设备是服务器,我只能通过DLL控制它们。 Dll是为MFC编写的,它不是由我编写的,所以我无法对它进行任何操作。

Dll建立设备和我的应用程序之间的TCP / IP通信。每个设备都有不同的变量。我需要为每个传入连接打开一个新线程并加载我的dll实例。我无法为每个线程加载不同的dll实例。每次使用相同的dll和相同的数据。

如何加载dll的多个实例? 有没有办法用c ++做到这一点。 在此先感谢

4 个答案:

答案 0 :(得分:3)

如果数据是静态的,则无法在同一进程中拥有更多实例。你必须修改dll以获得某种每个上下文数据(通常类实例会这样做)。无论如何,作为一般建议,永远不会在进程上启动10000个线程,这将会破坏性能。编写一个线程池,让管理客户端由该池提供服务。

答案 1 :(得分:1)

你的情况听起来并不乐观。

Windows不会在给定进程中加载​​多个DLL实例。如果DLL本身没有连接到多个服务器的功能,则必须为需要连接的每个服务器创建单独的进程。在实践中,这将是一个坏主意。

你可以使用LoadLibrary()和UnloadLibrary()来多次“重启”DLL,然后在不同的服务器之间疯狂切换。 LoadLibrary()的一部分...与服务器的混乱...... UnloadLibrary()......再做一次并且重视并重写情况。这将是痛苦和缓慢的,但可能对你有用。

答案 2 :(得分:0)

我没有看到一个简单的解决方案,如前所述,您无法在应用程序中创建DLL的多个实例。

可能有一个可怕的解决方案,即编写一个轻量级代理来监听入站请求,并在每个请求上生成真实应用程序的新实例,并将流量转发给它 - 应该有一种方法来加载每个实例中DLL的新副本(从技术上讲,您将重新打开相同的加载DLL,但它应该有单独的数据空间)。

然而,对于10k设备,性能将是可怕的。听起来最好的解决方案是重新实现协议(使用已发布的规范,或对其进行反向工程)。

答案 3 :(得分:0)

多次加载dll的唯一(丑陋)方法是,在您控制的位置使用唯一名称制作原始dll副本的每个新加载。

使用LoadLibrary加载副本并设置适当的函数指针(GetProcAddress(...))到新加载的dll中的函数,以便在程序中使用。

完成后,使用FreeLibrary卸载副本,然后从磁盘中删除副本。