2012-07-19 71 views
1

我有一个调用运行在下面的应用程序的DLL。该DLL同时被其他几个应用程序/进程加载。 左右,基本架构是:如何检测DLL没有被任何应用程序使用

enter image description here

我的问题是,如果应用程序(S)使用的DLL崩溃,我想在我的基本应用程序执行的退出序列和退出。 如何检测到这个DLL不再被任何应用程序使用? 有没有像加载计数的DLL,我可以跟踪? 另一个小故障是我可能不得不通过C#应用程序来监视这个,但这是更进一步的事情。

+0

可能的重复[如何检查dll的引用计数?如何知道DLL的加载?](http://stackoverflow.com/questions/3553231/how-to-check-dlls-reference-count-how-to-know-where-the-dll-was-loaded ) – 2012-07-19 07:22:46

+0

如果应用程序崩溃或如果我从任务管理器中杀死它,它执行“FreeLibrary”吗? – Swanand 2012-07-19 07:30:27

+1

您可以在基本应用程序中托管该DLL,并使用共享区段实现自己的引用计数,这很容易并且经常使用。 – mox 2012-07-19 07:47:11

回答

0

您可以在基本应用程序中托管该DLL,并使用共享部分实现自己的引用计数,这很容易,并且经常使用。如前所述,一种可能性是在DLL entry point内部实现您的参考计数,并根据您的规格检测DLL_PROCESS_DETACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH等。

1

你的形象是不是真正发生的事情的Windows一个很好的模式。每个进程都有它自己的DLL副本。 DLL中的代码在RAM中共享,但不是其数据。有多种方法可以共享数据,但这并不常见,内存映射文件是更为典型的方法。

Windows不会以低成本的方式查明DLL是否加载到进程中。也没有通知机制。无论你做什么,它都必须先从流程开始。这也适用于C#,你可以使用Process.Modules property

只是跟踪你知道加载DLL的进程可能就足够了,当进程不再运行时,你可以放心地认为它没有再加载DLL。使用Process.Exited事件或使用WMI,如this answer所示。

+0

感谢这个,但是我不能知道哪个进程会加载这个DLL。 – Swanand 2012-08-09 12:06:58

+0

嗯,当然你可以。你的DLL可以知道它何时加载,它的DllMain()方法运行。 – 2012-08-09 12:20:00

+0

Ohh ......这样......我误解了你的判决! – Swanand 2012-08-09 13:24:58

相关问题