我有2个 静止的 2 中的物体 不同的dll:

一个东西 资源 (这是一个单例)和一个对象 用户. 。对象用户在其析构函数中必须访问对象资源。

如何强制对象资源不在对象用户之前被破坏?

有帮助吗?

解决方案

当它们相应的DLL卸载全局对象被销毁。所以当你的“用户”的dll可能是依赖你的“资源” DLL的,你有麻烦了:“资源”总是会前“用户”摧毁

我也有兴趣通过很好地回答了这个问题,如果一个存在。到现在为止,我使用的是清理功能必须由应用程序它退出之前被调用,而我只保留无害的代码析构函数。

其他提示

如果你能够把那个2个全局变量在同一个DLL它是不一样的故事。由于在自己的答复告诉正义与平等运动,DLL超脱为了不被系统保证。因此,你可能有一个很大的问题已经2个独立的DLL时。我不是Windows系统大师,但与谷歌一看,我发现MSDN博客谁告诉他们有同样的问题没有很好的解决方案,以解决这一问题。

我你可以把它们放在同一个DLL,根据我的解决方案更容易,在这种情况下,你并不需要(据我了解不可解)解决“不保证下,DLL超脱秩序”的问题。结果 但你仍然需要解决一个新的问题:全局变量破坏秩序不被C ++语言保证下,。但是这一个可以解决:

您需要使用某种参考couting的的。升压:: shared_ptr的可达到目的。

声明它全球并定义它的方式:

boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!

然后,你需要修改你的用户实施商品其自身的shared_ptr:

class User
{
    ...
    boost::share_ptr a_resource_ptr;
    ...
};

只要你的用户实例的全部一个不被破坏,那些将“保留”资源实例,因此防止被删除prematuraly,尽管全球shared_ptr的可能已被销毁。结果 最后User实例被破坏将(undirectly)删除资源实例。

无论您使用引用计数,ComPtr,你自己的,它应该做的伎俩。

我不认为你可以更改在不同的模块全局的破坏秩序。 加入一些引用计数的任何机会?

如果您确实想要获得 2 个独立的 Dll,我可能会给您一些提示:你可以考虑使用 FreeLibrary() 来自 Windows API。正如所述 msdn FreeLibrary() 减少 Dll 的引用计数器,当计数器达到 0 时,该 Dll 被卸载。

退税:使用 FreeLibrary() 意味着您正在加载它 LoadLibrary() (msdn链接)并且从该库调用函数意味着您正在使用 GetProcAddress() 函数,这可能会导致非常丑陋的代码。它也可能意味着你的代码发生了一些变化 - 作为获取指向 Dll 函数的全局变量,以便存储每个函数的地址......

如果你想实现它:

  1. 您必须从您的计算机中加载并释放该库 main() 您的流程的功能,
  2. 并从实现 User 类的 Dll 中加载和释放库。实施它在 DllMain() 该 Dll 的函数,当原因是 DLL_PROCESS_DETACH (看 mdsn的Dll主链接.

因此,只有在“用户”库完成后,它才会卸载“资源”库。

如果你愿意的话,请尝试一下,并告诉我它是否有效,因为我从未实施过它。

附:我对你的问题发布了第二个答案,以便在我(尝试)详细说明这两个答案时,在这两个答案之间进行有意义的区分。我不想让你把它们混淆起来并感到困惑......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top