【问题标题】:c++, multiple instances of a dll, singletonc++,一个dll的多个实例,单例
【发布时间】:2011-01-07 10:57:09
【问题描述】:

我有一个定义了单例的 DLL。

我有一个可以加载此 DLL 的多个实例的应用程序。

DLL 需要每个 DLL 实例一个单例实例,否则会崩溃。

我观察到多个 DLL 实例只有一个单例实例。为什么?我该如何解决它(如果可能,不将单例重构为其他东西)?

感谢您的帮助。

【问题讨论】:

  • 使用单身,一分钱一分货。
  • @Sanja:您链接的问题是关于在具有单个单例的多个应用程序中使用的 dll。这个问题是关于在具有多个单例的单个应用程序中使用的 dll。
  • @moala:您认为为什么(以及如何)在单个应用程序中加载 DLL 的多个实例?
  • @interjay:insightfull,在 DllMain 中添加跟踪信息时,我看到 DLL 只加载了一次,并且我的插件实例被实例化了多次。现在事情有点清楚了。
  • 您究竟是如何在一个进程中加载​​同一个 DLL 的多个实例的?

标签: c++ dll singleton multiple-instances


【解决方案1】:

您提到您的应用中有多个实例,这意味着它们都存在于同一个进程中。

与任何其他静态成员一样,单个应用程序限制为每个应用程序一个,无论它们是否属于从 DLL 等加载的对象。

【讨论】:

    【解决方案2】:

    如果不重构代码,就没有办法。 DLL 被“加载”到进程空间中。在那里定义的任何静态成员对于进程都是静态的(加载的 DLL 没有自己的内存)。

    你必须编写一个非标准的“单例”来获取多个对象。

    【讨论】:

      【解决方案3】:

      如果您没有 dll 的源代码,那么您必须在不同的进程中加载​​它,每个进程一个“单例”。这些可能是只处理 dll 通信部分的主进程的简单子进程。

      当然,您必须在主进程和子进程之间提供一些通信方案,这取决于您使用 dll 的程度。只是几个带有大量数据的电话吗?还是有很多不同的调用因运行而异?

      一般来说,如果您使用 dll 进行多次简单调用,那么重构您自己的代码可能会更容易。

      【讨论】:

      • 嗯,很好的包装理念。取决于许多参数,可能是大工作或小工作。
      猜你喜欢
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多