討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 傑米的攝影旅遊筆記 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
請問EDIT Control 數據資料存成 INI時出現的BUG
更改我的閱讀文章字型大小
作者 : difgor04262002(Gavin0130)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/10/16 下午 06:27:19
void ExaminationMode::OnBnClickedLimitvalueSave()
{
// TODO: 在此加入控制項告知處理常式程式碼
int _i;
int _j;
CString _str1;
CString _str2;

CString szFilter = "INI FILE (*.INI)|*.ini|*.*|*.*||";
CFileDialog dlg(false,"INI",NULL,OFN_HIDEREADONLY,szFilter,this);
if ( dlg.DoModal() == IDOK )
{
g_strLimitFilePath = dlg.GetPathName();

for(_i=0;_i<11;_i++)
{
CEdit* _edit = (CEdit*) GetDlgItem(IDC_EDIT_Limit1+_i);
_str2.Format("ITEM%d",_i+1);
_edit->GetWindowText(_str1);
::WritePrivateProfileString("MAIN",_str2,_str1,g_strLimitFilePath);
}

::WritePrivateProfileString("MAIN","NUM#","11",g_strLimitFilePath);
::WritePrivateProfileString("MAIN","KEWORD","IN8089",g_strLimitFilePath);
m_pathname.SetWindowText(g_strLimitFilePath);

}
}
以上程式碼在執行時,當變數"_i"累加到3,會出現
『於0x00354 的 *****.exe 中發生未處理的例外狀況:
 0xC0000005: 讀取位置 0x00000020 時發生存取違規』

並且停在『wincore.cpp』的

void CWnd::GetWindowText(CString& rString) const
{
ASSERT(::IsWindow(m_hWnd)); ←停在這裡!!

#ifndef _AFX_NO_OCC_SUPPORT
if (m_pCtrlSite == NULL)
{

煩請先進解惑!感恩!!
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人difgor04262002註記此篇回應為最佳解答 2013/10/16 下午 08:24:48
>以上程式碼在執行時,當變數"_i"累加到3,會出現
>『於0x00354 的 *****.exe 中發生未處理的例外狀況:
> 0xC0000005: 讀取位置 0x00000020 時發生存取違規』
>
>並且停在『wincore.cpp』的
>
>void CWnd::GetWindowText(CString& rString) const
>{
> ASSERT(::IsWindow(m_hWnd)); ←停在這裡!!

用 IDE 的 call stack, 看看是你程式中的那個句子進入到這裡. 我懷疑是這句:
  CEdit* _edit = (CEdit*) GetDlgItem(IDC_EDIT_Limit1+_i);

你ExaminationMode dialog 裡 edit 控制項的 ID 是連貫的嗎?

IDC_EDIT_Limit1+_i 並不是一個好的寫法, 因為任何 dialog 上的變動都有可能導致 ID 的變更. 比較好的做法是用個陣列來存 ID:
  int myEditId[] = {IDC_EDIT_Limit1, IDC_EDIT_Limit2, ...};

然後:
  CWnd* wnd = GetDlgItem(myEditId[i]);

這就無需考慮到 ID 連貫性的問題.

除了 edit 控制項裡 ID 的連貫性有可能導致你看到的問題外, 這個句子有另一個問題: Casting. GetDlgItem() 傳回來的指標不應該, 不可以 cast 成任何 CWnd 的衍生 class, 會導致不可預期的結果.

如果你用 dynamic_cast<CEdit*> 來 cast, 某些情況下的結果是 NULL, 某些情況下的結果是一個真正的 CEdit 指標. 關鍵是 MFC 內部的 C++ 物件/視窗物件的 map 內有沒有該 edit 控制項的 entry.
作者 : difgor04262002(Gavin0130)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/10/17 上午 09:46:34
>用 IDE 的 call stack, 看看是你程式中的那個句子進入到這裡. 我懷疑是這句:
>  CEdit* _edit = (CEdit*) GetDlgItem(IDC_EDIT_Limit1+_i);
>
>你ExaminationMode dialog 裡 edit 控制項的 ID 是連貫的嗎?
>
>IDC_EDIT_Limit1+_i 並不是一個好的寫法, 因為任何 dialog 上的變動都有可能導致 ID 的變更. 比較好的做法是用個陣列來存 ID:int myEditId[] = {IDC_EDIT_Limit1, IDC_EDIT_Limit2, ...};

依照您建議的方式問題的確是解決了!並且一起解決了讀檔問題!
但是,我的EDIT CONTROL ID確定是連貫的;IDC_EDIT_Limit1、IDC_EDIT_Limit2、IDC_EDIT_Limit3、IDC_EDIT_Limit4、••••;為何設定好的ID會被DLG的變動而被變更。

>==========================================================================
>除了 edit 控制項裡 ID 的連貫性有可能導致你看到的問題外, 這個句子有另一個問題: Casting. GetDlgItem() 傳回來的指標不應該, 不可以 cast 成任何 CWnd 的衍生 class, 會導致不可預期的結果.
>
>如果你用 dynamic_cast<CEdit*> 來 cast, 某些情況下的結果是 NULL, 某些情況下的結果是一個真正的 CEdit 指標. 關鍵是 MFC 內部的 C++ 物件/視窗物件的 map 內有沒有該 edit 控制項的 entry.

以上這一段我看得不是很明白。可否再做說明~麻煩您了!
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人difgor04262002註記此篇回應為很有道理 2013/10/17 下午 12:05:00
>但是,我的EDIT CONTROL ID確定是連貫的;IDC_EDIT_Limit1、IDC_EDIT_Limit2、IDC_EDIT_Limit3、IDC_EDIT_Limit4、••••;為何設定好的ID會被DLG的變動而被變更。

這裡的「連貫」指的不是 IDC_EDIT_Limit1/2/3/4 這些名字符號, 而是這些名字符號所代表的數值, 在 resource.h 裡, 比方說:
  ...
  #define IDC_EDIT_Limit1 123
  #define IDC_EDIT_Limit2 124
  #define IDC_EDIT_Limit3 125
  #define IDC_EDIT_Limit4 200
  ...

在這個例子裡, 只有 IDC_EDIT_Limit1/2/3 是連貫的, IDC_EDIT_Limit4 的數值跳了.

這些數值是 IDE 的 resource editor 自動填入的, 視窗系統的 resource ID 都是數值, 用 #define 符號是方便程式設計.

[關於 GetDlgItem() 及 casting]

這個比較簡短:
http://www.jrtwine.com/Articles/MFCNoNos/MFCNN1.htm

如果你要更詳盡的分析, 看:
https://www.microsoft.com/msj/0997/c0997.aspx

https://www.microsoft.com/msj/1297/c1297.aspx

 板主 : 徵求中
 > Visual C++ .NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ .NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++ .NET
1 青衫 2220 
2 Raymond 1500 
3 joe 520 
4 冷眼 350 
5 CodeWarrior 260 
6 marlon 230 
7 小朱 210 
8 windblown 200 
9 XWLin 120 
10 小約翰 120 
Visual C++ .NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125