我不是静态的粉丝,但我有一些代码:
除非别的东西在附近,否则静态破坏将会失败。 静态声明为DLL类中的成员。
可执行文件正在closures,因此运行时调用FreeLibary来释放启动时加载的DLL。
我知道在我的程序终止的时候,静态会被破坏(因为没有对施工顺序的保证,所以没有破坏命令的保证),但是什么时候会被破坏? 我的DLLMain
(对于加载的DLL)退出后,或运行时__DllMainCRTStartup
后,甚至在此之后?
我只想知道在破坏之前我是否有机会做一些事情,如果没有的话,我将需要考虑将静态移除到更合适的地方。
也许atexit函数将帮助你。 你给它一个回调函数,在进程分离期间由运行时执行。
DLL说明: http : //msdn.microsoft.com/en-us/library/988ye33t.aspx
atexit: http : //msdn.microsoft.com/en-us/library/tze57ck3.aspx
从你的问题我知道你在Windows上,并与微软编译器。 我的回答是特定于这个设置(虽然我很确定gcc是相似的)。
简短的回答是:
只要你的DLL在附近,而且它依赖于另外一个DLL,而你不用搞砸东西(比如你没有FreeLibrary的依赖),那么依赖DLL依然在内存中处于工作状态,并且可以叫做。 依赖DLL上的关机顺序只有在DLL完全关闭后才会启动。
使用Microsoft Visual Studio编译的DLL上的序列顺序:
我认为另一种可能的解决方法是建立一个全局类,它的构造函数只需调用CoInitilize
和析构函数调用CoUninitilize
。
然后确保这个全局是在包含一个ComPtr
的对象之前创建的。 由于销毁将与构造相反,调用CoUninitilize
的析构函数将在.Release
上调用ComPtr
之后发生。