2011-04-12 114 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;