一.概述
一些重要的程序,必須讓它一直跑著;而且還要時時關心它的狀態——不能讓它出現死鎖現象。當然,如果一個主程序會出現死鎖,肯定是設計或者編程上的失誤。我們首要做的事是,把這個Bug揪出來。但如果時間緊迫,這個Bug又“飄忽不定”,那麼,我們還是先寫一個軟件“看門狗”,暫時應一下急吧。
“看門狗”的需求描述:“看門狗”的運行不出現界面窗口,具有一定的隱蔽性;定時判斷目標進程是否運行在當前中,如果沒有則啟動目標進程;判斷目標進程是否“沒有響應”,如果是則終止目標進程;如果目標進程“沒有響應”的次數超過一定的數量,則將計算機系統重啟。
二.預備知識
首先要介紹兩個主要的函數,能夠判斷目標進程是否“沒有響應”。在User32.dll中(沒有文檔公開),Win2k/NT下的IsHungAppWindow和Win9X下的IsHungThread;前者是以一個窗口句柄作為參數,後者是以線程ID作為參數。我們可以通過VC開發工具的Depends查到這兩個函數。
要使用這兩個函數,我們必須先動態導入,如下:
if (m_hUser32 == NULL)
{
m_hUser32 = GetModuleHandle("USER32.DLL");
}
if (m_hUser32)
{
m_IsHungNT = (HUNG_FUNNT) GetProcAddress(m_hUser32, "IsHungAppWindow");
m_IsHung9X = (HUNG_FUN9X) GetProcAddress(m_hUser32, "IsHungThread");
}
另外,還有如下知識點:
1. 如何讓窗口隱藏(當然通過Windows任務管理器還是可以看到的)
在框架窗口類的PreCreateWindow中修改窗口風格,如下: