我有一個調用運行在下面的應用程序的DLL。該DLL同時被其他幾個應用程序/進程加載。 左右,基本架構是:如何檢測DLL沒有被任何應用程序使用
我的問題是,如果應用程序(S)使用的DLL崩潰,我想在我的基本應用程序執行的退出序列和退出。 如何檢測到這個DLL不再被任何應用程序使用? 有沒有像加載計數的DLL,我可以跟蹤? 另一個小故障是我可能不得不通過C#應用程序來監視這個,但這是更進一步的事情。
我有一個調用運行在下面的應用程序的DLL。該DLL同時被其他幾個應用程序/進程加載。 左右,基本架構是:如何檢測DLL沒有被任何應用程序使用
我的問題是,如果應用程序(S)使用的DLL崩潰,我想在我的基本應用程序執行的退出序列和退出。 如何檢測到這個DLL不再被任何應用程序使用? 有沒有像加載計數的DLL,我可以跟蹤? 另一個小故障是我可能不得不通過C#應用程序來監視這個,但這是更進一步的事情。
您可以在基本應用程序中託管該DLL,並使用共享部分實現自己的引用計數,這很容易,並且經常使用。如前所述,一種可能性是在DLL entry point內部實現您的參考計數,並根據您的規格檢測DLL_PROCESS_DETACH,DLL_THREAD_DETACH,DLL_PROCESS_DETACH等。
如果你能外殼外部程序做檢查,你可以使用這個: http://technet.microsoft.com/en-us/sysinternals/bb896656
非常感謝,但我不能使用外部程序! :( – Swanand 2012-07-24 09:49:29
你的形象是不是真正發生的事情的Windows一個很好的模式。每個進程都有它自己的DLL副本。 DLL中的代碼在RAM中共享,但不是其數據。有多種方法可以共享數據,但這並不常見,內存映射文件是更爲典型的方法。
Windows不會以低成本的方式查明DLL是否加載到進程中。也沒有通知機制。無論你做什麼,它都必須先從流程開始。這也適用於C#,你可以使用Process.Modules property。
只是跟蹤你知道加載DLL的進程可能就足夠了,當進程不再運行時,你可以放心地認爲它沒有再加載DLL。使用Process.Exited事件或使用WMI,如this answer所示。
可能的重複[如何檢查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
如果應用程序崩潰或如果我從任務管理器中殺死它,它執行「FreeLibrary」嗎? – Swanand 2012-07-19 07:30:27
您可以在基本應用程序中託管該DLL,並使用共享區段實現自己的引用計數,這很容易並且經常使用。 – mox 2012-07-19 07:47:11