2011-04-12 112 views
3

我有下面的代碼段,其中m_edit是一個CEdit控制:的CEdit ::函數getline()的Windows 7

TCHAR lpsz[MAX_PATH+1]; 

// get the edit box text 
m_edit.GetLine(0,lpsz, MAX_PATH); 

這工作完全運行Windows XP和更早版本的計算機上。我沒有在Vista中測試過,但在Windows 7上,lpsz獲取插入到其中的垃圾unicode字符(以及有時候的實際文本)。關於這裏發生了什麼的任何想法?

回答

3

由於您使用MFC,爲什麼不利用其CString類?這是許多程序員被MFC吸引的原因之一,因爲它使得使用字符串變得更容易。

例如,你可以簡單地寫:

int len = m_edit.LineLength(m_edit.LineIndex(0)); 
CString path; 
LPTSTR p = path.GetBuffer(len); 
m_edit.GetLine(0, p, len); 
path.ReleaseBuffer(); 

(上面的代碼進行測試,以做工精細在Windows 7中)

注意,複製的行不包含空終止字符(請參閱documentation中的「備註」部分)。這可以解釋你在更高版本的Windows中看到的無意義字符。

+0

這裏存在輕微的風險。如果另一個線程可能會在查詢長度和實際查詢之間更改編輯控件的窗口文本以獲取該行。最好使用GetLine的返回值來確保您必須確定您剛剛複製的文本的實際長度。 (不可否認,在大多數GUI代碼中這是非常罕見的。) – 2011-05-18 23:47:13

+0

@Adrian:或許,但我認爲這只是一個「錯誤」,而不是「非常罕見」。你*希望*應用程序在這種情況下失敗,所以你知道你無意中從一個單獨的線程訪問UI控件。 – 2011-05-19 03:47:36

+0

如果你的設計說控件應該只能從一個特定的線程訪問,那麼,是的,這將是一個錯誤。並非所有的GUI代碼都是這樣設計的。 GetWindowText(它是CEdit :: GetLine的基礎)專門設計用於處理從另一個線程或甚至另一個進程中獲取文本。 – 2011-05-19 21:02:48

4

它不是空終止。您需要這樣做:

int count = m_edit.GetLine(0, lpsz, MAX_PATH); 
lpsz[count] = 0;