我的代碼被編譯爲Windows DLL與Visual C++。我想在調用terminate()
時記錄罕見情況,因此我在庫初始化函數中設置了terminate()
處理程序,後者在使用我的庫之前由用戶代碼調用。我的處理程序寫入日誌並調用abort()
來模擬默認的terminate()
行爲。如何檢測是否安裝了自定義的terminate()處理程序?
問題是用戶代碼也可能用C++編寫,並使用相同的C++運行時版本,因此與我的庫共享terminate()
處理程序。該代碼可能還希望更改terminate()
處理程序以進行日誌記錄。所以他們會打電話set_terminate()
,然後加載並初始化我的庫,我的庫也會調用set_terminate()
並覆蓋它們的terminate()
處理程序,這對他們來說很難檢測到,因爲terminate()
處理程序是他們將要測試的最後一個東西。
所以我想要以下內容。在庫初始化函數中,我將retrieve the current terminate()
handler,找到它是否是一個標準的,然後如果它碰巧是一個非標準的函數,我將存儲它的地址,稍後(如果需要)我的terminate()
處理程序將寫入日誌,然後將呼叫轉移到該自定義terminate()
處理程序。
是否有可能找到當前安裝的terminate()
處理程序是默認還是自定義程序?
如果你打算反正調用'abort',爲什麼不總是鏈接到前一個終止處理程序而不是調用'abort'? –
FWIW,我不認爲鏈接以前的終止處理程序是一個好主意。如果程序死於代碼中,請調用您的處理程序,如果在主機代碼中,則調用主機處理程序。請參閱下面我的RAII答案以瞭解如何實現此目的。 – Ben