2010-09-21 125 views
0

我最近將一個visual studio 6.0項目轉換爲visual studio 2010,並且在某些項目上調用GetDlgItem時遇到問題。以下代碼失敗。GetDlgItem()在vC++ 2010中返回null

CWnd *pWnd = (CWnd*) GetDlgItem(IDC_BATCH); 
pWnd->GetWindowText(szBatchNum); 

我看到這個代碼在我的資源文件中調用上面的代碼的窗體。

IDD_CC_PROCESS DIALOGEX 0, 0, 657, 410 
STYLE DS_SETFONT | WS_CHILD 
FONT 8, "MS Sans Serif", 0, 0, 0x0 
BEGIN 
CONTROL   "",IDC_BATCH,"{978C9E23-D4B0-11CE-BF2D-00AA003F40D0}",0x0,85,18,89,16 
END 

調用GetDlgItem()之後pWnd爲NULL。這在6.0版本的項目中不是問題。 IDC_BATCH似乎是此表單上的有效資源。 IDC_BATCH指向「Microsoft Forms 2.0標籤」。這似乎是我在將項目從6.0轉換爲2010時遇到的許多問題中的一個。

+0

檢查您的資源文件。如果它返回NULL,那麼沒有該ID的子項dlg項... – Goz 2010-09-21 16:17:17

+0

我在我的資源文件中添加了我在上面看到的內容。 – 2010-09-21 17:20:13

+0

如果你在調用GetDlgItem的時候斷點並用Spy ++搜索窗口,你會發現它嗎?我猜你不會。 – 2010-09-21 17:27:28

回答

0

嘗試枚舉呼叫來自GetDlgItem調用的CWnd的子項,並查看該句柄是否包含子項。你也應該檢查GetLastError返回的值,這應該表明它是否有實際的錯誤,錯誤是什麼,或者如果控件真的沒有子項(這可能是res文件中的錯誤),或者父控件即使存在

+0

我迭代了所有的子項,它基本上與我在Spy ++中看到的一致。除了2個「Microsoft Forms 2.0標籤」控件外,表單上的所有控件都在那裏。 GetLastError()也沒有返回任何錯誤。 – 2010-09-21 18:38:18

+0

我能想到的唯一的另一件事是控制ID不匹配,你的代碼從一個頭部拉出,res文件從別的ID拉出來 – Necrolis 2010-09-21 20:21:03

1

我對這個問題沒有任何特別的知識,但我會檢查是否已經爲VS2010附帶的MFC版本更新了GUID /控件。如果MFC版本無法通過GUID識別控件類型,則可能無法爲其正確創建CWnd包裝器對象。您可能需要更新VS2010的GUID,和/或嘗試使用本機Win32調用來訪問它,而不是MFC包裝器調用。

希望有所幫助。

+0

我真的不知道該怎麼做。你有任何可以幫助我開始的信息嗎? – 2010-09-22 17:15:26

+0

搜索您正在嘗試執行的Win32等效函數的MSDN,或查看MFC源代碼並對其進行仿真。這可能是處理它的最簡單的方法,除非您需要對在MFC包裝器中實現的控件執行一些不平凡的操作。 – Nick 2010-09-22 18:03:17