2013年4月15日 星期一

抱怨VC6//File: afx.ini Line: 122 的bug

這個MFC的問題,我在網路上也是找了很久,沒有解,一直到無意間解開了!再重現。以下是以我自己的case做範例重現。


我的main project使用SDI,利用Menu打開各種的Dialog做操作,各個Dialog我都做一個sub project檔來個別開發、測試,最後在main project用#include的方式把code加入,再把dialog的interface給拉到main project,這樣就可以使用。

但是,這樣卻引發了一個隱藏的問題。



問題描述:

我想要把sub project給刪除掉,並且將code整合到main project。

這兩個project重疊的檔案


從這開始操作

在main project中,加入code
新增dialog(命名了相同的名字)
複製sub project中要的dialog所有的member function


執行程式

開啟這次移植的dialog,出現了這次問題的主角

收集線索

先來看看什麼是
afx.ini line: 122

// CString
_AFX_INLINE CStringData* CString::GetData() const
{
ASSERT(m_pchData != NULL);
return ((CStringData*)m_pchData)-1;
}
CString???

再看看dialog啟動的程式段
void CColorEyeIApp::OnFileOmdtoxls() 
{
// TODO: Add your command handler code here
CSelExcelDlg dlgSelExcel;
dlgSelExcel.DoModal();
}
用debugger看看程式執行

到此收集到的線索及推測
「此bug是由button按下之後,到dialog::deconstruct()執行完畢出的問題。」
變成
「此bug是由程式deconstruct執行完畢出的問題。」

先看看是~CString()還是~CSelExcelDlg()的問題?
~CSelExcelDlg()沒有override,那找找看~CString()出問題的可能性。

看看CSelExcelDlg中,到底有沒有CString
class CSelExcelDlg : public CDialog
{
FormType m_ft;
int m_openOmdLimit;
std::vector><cstring> m_omdFilesList; // m_vOmdFilePathList;
//…
發現CString!!!

這個CString member variable相關的member function都註解掉

執行程式
  1. 按下Cancel 
  2. ~CSelExcelDlg 
  3. ~CString 
  4. 當掉 

還是當掉了。

問題就是沒有被overload的~SelExcelDlg了?!

李組長眉頭一皺,發現案情並不單純!

怎麼可能沒override卻出了問題?

問題真正的解法

就在整理程式碼(刪掉SelXls/SelExcelDialog.h & SelXls/SelExcelDialog.cpp)之後,發現#include出了問題

修正#include的檔案之後。

再Rebuild All,就好了。

沒有留言:

張貼留言