1. 程式人生 > >記錄MFC各種各樣的BUG

記錄MFC各種各樣的BUG

【1】TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
resource.h中檢視控制元件是否唯一繫結。

DDX_Control刪除語句得以解決。

【2】VS fatal error C1083:無法開啟包括檔案“afxcontrolbars.h”:No such file or diretory
方法1:安裝SP1補丁
方法2:
雙擊出錯行,定位到相關檔案(stdafx.h),
把#include <afxcontrolbars.h> 註釋掉,後面加了一行#define CWinAppEx CWinApp
改好後如下:
 //#include <afxcontrolbars.h>     // 功能區和控制元件條的 MFC 支援
 #define CWinAppEx CWinApp

2016/9/2
【1】新增OnInitDialog函式除錯報錯errorC2555:重寫虛擬函式返回型別有差異
類嚮導新增時返回型別選int
好像是要和基類的返回型別一致
[2]0x77404cc9 處未處理的異常: 0xC015000F: 正被停用的啟用上下文不是最近啟用的。
解決:
Debug->異常->勾選win32 丟擲異常
報錯: 很可能是0xC0000094: Integer division by zero
原來是OnSize()函式裡頭
CWnd *pWnd;
pWnd=GetDlgItem(IDC_TAB_MAIN);//獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy);//呼叫changesize()函式
GetClientRect(&m_rect);//漏了這一句!m_rect裡Width為0了
讓你瞎改!瞎改!

2016/9/6

【1】如何在VS的一個專案裡新增另一個專案的對話方塊資源
把原來的工程裡面對話方塊對應h和cpp檔案拷貝到新工程資料夾下面,在標頭檔案和原始檔裡新增現有專案.h和.cpp檔案,然後新建一個對話方塊,把ID改為原來的一樣,選擇選單檔案,開啟,開啟原工程資料夾下面的.rc檔案,這樣就可以複製相應對話方塊上面的控制元件了。執行後會報錯,要把包含的標頭檔案改為現在的檔名稱。

2016/9/7


【1】1>LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 檔案無效或損壞


 當VS2010安裝後,VS2008的cvtres.exe就無法使用了。如果PATH環境變數中VS2008的工具路徑第一個出現,而且連結器需要將.res檔案轉換為COFF 物件格式,就會導致LNK1123錯誤。


治本:把VS2010所在安裝路徑下的bin/cvtres.exe直接刪除就可以了。


其他解決方法:將 專案|專案屬性|配置屬性|清單工具|輸入和輸出|嵌入清單  “是”改為“否”即可,但是每新建一個專案都要這樣設定一次。


2016/9/8
【1】VS每次執行控制檯程式時結果視窗一閃而過
專案->屬性->配置屬性->連結器->系統->子系統->控制檯 增加“/SUBSYSTEM:CONSOLE”連結選項。
編譯後執行,或Ctrl+F5




2016/9/19
【1】 error C2065: “IDD_DIALOG_PWDALT”: 未宣告的識別符號
在遇到類似沒有定義的問題時首先考慮定義是否在其他標頭檔案內而又沒包含其該檔案。
將resource.h檔案包含在出錯檔案下


【2】開啟資源檢視時-提示在另一個編輯器中開啟
把Resource.h檔案關了後雙擊.rc

2016/10/10
【1】 error C2660: “MessageBoxW”: 函式不接受 1 個引數
MessageBox函式的區別:
一個引數的MessageBox是MFC封裝Win SDK的,只能在對話方塊裡面進行呼叫;
例如:MessageBox( "pGRAY 空間申請失敗");


而四個引數的MessageBox函式,是Win SDK的,他有四個引數。 
例如:MessageBox(NULL, "pGRAY 空間申請失敗", "提示", MB_OK);
函式原型為:
int MessageBox(
  HWND hWnd,          // handle to owner window
  LPCTSTR lpText,     // text in message box
  LPCTSTR lpCaption,  // message box title
  UINT uType          // message box style
);
把四個引數寫全就行了。
可是為什麼非要寫全呢!!!我在上一個程式裡就不用寫全啊!!這是基於對話方塊和單文件的區別麼?


【2】error C2664: “MessageBoxW”: 不能將引數 1 從“_bstr_t”轉換為“HWND”
MessageBox(e.Description(),L"連線錯誤",MB_OK|MB_ICONINFORMATION);
錯在那個e.Description(),這我就理解不能了,解決不了只能改為NULL……沒有異常的情況下並不影響


【3】在主程式單文件前載入對話方塊
一定要注意迴圈巢狀中的大括號!
一個大括號引發的一系列莫名其妙的程式結束。

【4】“GetDlgItem”: 函式不接受 1 個引數
尷尬,並沒有完成……
//為測試方便,免密碼登入
int nTest=((CButton*)GetDlgItem(IDC_CHECK_TEST))->GetCheck();//報錯
GetDlgItem有兩個版本
1.win32 api
這個版本需要傳入視窗的控制代碼,即GetDlgItem(hDlg, ID_XXX),返回值也是視窗控制代碼。//是了,帶上視窗控制代碼myDlg

2.cwnd
這個版本可在cwnd的所有派生類及派生類的派生類中直接呼叫。