如果進程正在使用相同的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