2012-07-19 38 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

相關問題