TimerWnd 類的乙個 bug

2021-04-12 19:10:25 字數 969 閱讀 3901

今天準備修改一下伺服器程式關於 socket, 執行緒這一塊的**. 將 cobjectthread 的乙個成員 m_ppclayer 變成了父類. 發現程式在 timerwnd 的**出現問題.

分析發現, timerwnd 在 pclayer 和 ccamthread 中被使用. **改完之後, 程式會先建立 pclayer 的 3 個 timerwnd 的例項. 之後又建立 ccamthread 的乙個 timerwnd 例項. 但是, ccamthread 的例項卻呼叫了 pclayer 的 timerwnd 的 wndproc. 導致出錯. 除錯的大部分時間其實被用來得出這些結論.

有了這些, 後面的工作就好做了. 原來是 ccamthread 建立 timerwnd 視窗之前, 先註冊視窗類. 但是註冊失敗了. 使用了 pclayer 註冊的視窗類建立了視窗. 自然, 呼叫的是 pclayer 的 wndproc. timerwnd 的設計之初的想法是, 反正 registerclass 函式在第二次註冊時會失敗. 沒有多加考慮. 當乙個程式中有兩個不同的類繼承了 timerwnd, 今天這樣的問題就出現了. 因為以前的程式一般都只有乙個類使用了 timerwnd, 所以問題一直沒有發現.

最後乙個問題是, 為什麼修改**之前伺服器能正常執行呢? 現在就是體現 svn  的優勢的時候了. 改**之前我已經將**做了乙個 branch, 修改的是 branch 的**. 現在我從 svn 上取伺服器的主幹**到另乙個工作拷貝. 編譯, 加斷點, 除錯. 很快就得到了乙個令人瞠目結舌的答案. 原來在伺服器中 pclayer 的定時器一直沒有用過! 由於 pclayer 中的定時器是乙個冗餘容錯的設計. 不執行一般也不會有問題. 所以問題一直沒有暴露.

由於使用模版的緣故, 使得 timerwnd 如果被多個類使用, 則需要註冊不同的視窗類. 在這裡. 模版就不是那麼的合適了. 使用虛函式則不會有這樣的問題: 即使被多個類使用. 也只需要乙個視窗類, 乙個 wndproc, 只是呼叫不同的子類中的 ontimer 即可.  

CTime類的乙個BUG

最近學習pe結構的時候在有乙個image file header的時候發現有乙個引數是 dword timedatestamp 表示時間日期標記 表示從1970 1 1 0 0 0開始到現在的日期秒數。我想如果能夠修改,是不是能修改程式的日期。所以想到用需要修改的日期,減去1970 1 1 0 0 ...

CTime類的乙個BUG

最近學習pe結構的時候在有乙個image file header的時候發現有乙個引數是 dword timedatestamp 表示時間日期標記 表示從1970 1 1 0 0 0開始到現在的日期秒數。我想如果能夠修改,是不是能修改程式的日期。所以想到用需要修改的日期,減去1970 1 1 0 0 ...

微軟的乙個BUG

各位,我不知道我的這個發現屬不屬於微軟的乙個bug round 1.225,2 1.23 round 1.245,2 1.25 round 1.265,2 1.26 round 1.285,2 1.28 按照技術文章上說的,vb中round 函式屬於四捨五入函式,但實際執行當中,其實round 函式...