2

我不是静态的粉丝,但我有一些代码:

除非周围有其他东西,否则静态破坏将失败。静态声明为 DLL 类内部的成员。

可执行文件正在关闭,因此运行时调用 FreeLibary 以释放它在启动时加载的 DLL。

我知道静态将在我的程序终止期间被销毁(不保证销毁顺序,因为没有施工顺序的保证)但是什么时候可以准备好销毁?在我的DLLMain(对于加载的 DLL)退出之后或运行时之后,__DllMainCRTStartup甚至在此之后?

我只是想知道我是否有机会在破坏之前做某事,如果没有,我需要考虑将静电消除到更合适的位置。

4

3 回答 3

2

也许atexit功能会帮助你。您给它一个回调函数,该函数将在进程分离期间由运行时执行。

DLL 说明:http: //msdn.microsoft.com/en-us/library/988ye33t.aspx

atexit:http: //msdn.microsoft.com/en-us/library/tze57ck3.aspx

于 2012-09-21T05:44:57.613 回答
1

根据您的问题,我了解到您使用的是 Windows,并且使用的是 Microsoft 编译器。我的回答是针对这个设置的(尽管我很确定 gcc 是相似的)。

简短的回答是:
只要您的 DLL 存在,并且它依赖于另一个 DLL,并且您没有搞砸事情(例如,您没有 FreeLibrary 依赖项),那么依赖项 DLL 仍然在内存中工作状态,可以调用。只有在您的 DLL 完全关闭后,从属 DLL 上的关闭序列才会开始。

使用 Microsoft Visual Studio 编译的 DLL 上的序列顺序:

  • DllMainCRTStartup 是 DLL 的入口点。您可以在以下位置查看此方法的代码:c:\program files\Microsoft Visual Studio 11.0\VC\CRT\src\crtdll.c
  • DllMainCRTStartup 调用 CRT_INIT(同一文件)。
  • 在 DLL_PROCESS_ATTACH 中有各种初始化。然后它调用函数initterm。这个函数(在别处实现,见下文)是调用所有静态 C++ 对象的构造函数的函数。
  • 在 DLL_PROCESS_DETACH 中,CRT_INIT 调用一堆执行破坏的 onexit/atexit 例程。
  • 调用 CRT_INIT 后,DllMainCRTStartup 调用用户定义的 DllMain。
  • terminit 在 crt0dat.c 中实现。它有一个指向函数的指针数组(由编译器和链接器生成),这些函数在循环中被调用。每个函数都是静态对象的构造函数。
于 2012-09-19T15:02:04.627 回答
0

我认为另一种可能的解决方法是有一个全局类,它的构造函数只是调用CoInitilize和析构函数调用CoUninitilize

然后确保在包含 a 的对象之前创建此全局变量ComPtr。由于破坏将与构造相反,因此调用的析构函数CoUninitilize.ReleaseComPtr.

于 2012-09-21T10:19:41.067 回答