MFC中一個容易被忽視的問題
MFC對話框模式的程序經常有這樣一種業務需求:對話框初始化 --> 取得數據 --> 將數據顯示到對話框的控件中
該流程有一個潛在的問題,看下面的代碼:
BOOL CTestDlg::OnInitDialog()

{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// Get data here
char* szData = GetData();
// Set Ctrl value here
GetDlgItem(IDC_SOMEEDITCTRL)->SetWindowText(szData);
return TRUE;
}這樣的代碼編譯出來的程序運行起來有時會CRUSH,有時不會,調試起來很讓人頭痛。
錯誤出在“GetDlgItem(IDC_SOMEEDITCTRL)->SetWindowText(szData);”這一句,這行代碼是在對話框初始化時調用的,此時對話框資源有可能還沒有創建起來,因此GetDlgItem(IDC_SOMEEDITCTRL)有可能得到的就是空指針,也有可能得到的是非空卻被判斷為非窗口的指針。遇上這兩種情況,程序當然就CRUSH掉了。
這樣精簡的代碼當然很容易看出問題來,但是如果程序規模大了,資源多了,又有嵌套調用等等,發生這樣的錯誤就很難檢查出來。
解決的方法有很多,一定要確保在InitDialog結束之后再對控件資源進行操作。最簡單的方法是在InitDialog結束的時候PostMessage,然后在消息處理里面處理資源操作。

