如果进程正在使用相同的DLL,每个进程都会获得该DLL的静态(或“全局”)数据的私有副本。
所以你需要做的就是使列表成为一个DLL中的全局变量,并从每个应用程序链接到该DLL。这样,就不需要传递任何附加信息。
由于多DLL过程中对象的毁坏顺序的不可预测性,您陷入困境的想法充满了困难。
在main
或WinMain
函数的末尾转储列表的内容会简单很多。
如果您没有以一致的方式使用智能指针类,那就这样做。此外,它可能值得寻找循环引用计数 - 对象A有对象B的计数,反之亦然。这是未发布对象的常见原因。
更新:
要强制所有的静态析运行和释放对象,这样,那么你可以检查列表中的条目之后,你需要构建应用程序以某种方式。
假设您有一个非常小的EXE来启动进程,并加载了许多其他可以完成所有工作的DLL。这些其他DLL以某种方式(可能通过COM或COM类系统)以LoadLibrary加载。 LoadLibrary API的工作方式是将DLL加载到进程中,或者在DLL已经加载的情况下递增DLL上的内部引用计数器。 FreeLibrary API递减计数器直到达到零,然后卸载DLL(此时将执行该DLL的静态析构函数)。
为此,我们现在添加我们的诊断DLL,其中包含所有未完成引用计数对象的列表。所有其他DLL使用import-lib链接到诊断DLL,EXE也使用LoadLibrary。
当main
即将退出的EXE经过DLL列表处理它以前加载,并在所有这些调用FreeLibrary则。通过保持加载诊断DLL,它确保它仍然在那里。至少这是理论。
但是按照什么顺序应该卸载其他DLL?如果A.DLL具有指向B.DLL中定义的对象的静态指针,那么您最好首先卸载A.因此,您需要了解各种DLL如何形成“分层”体系结构,其中较高层依赖于较低层,从而为您提供卸载它们的安全顺序。另外,一旦卸载了所有的DLL,诊断列表中任何引用DLL中对象的条目现在都将指向堆上的有效数据,但vtable将指向已定义的代码通过现在已经卸载的DLL,所以你将无法调用这些对象的虚函数。你应该能够检查他们的数据。
对不起,你的问题是? – 2009-04-11 13:49:21