【问题标题】:CEdit::GetLine() windows 7CEdit::GetLine() 窗口 7
【发布时间】:2011-08-03 23:24:48
【问题描述】:

我有以下代码段,其中m_edit 是 CEdit 控件:

TCHAR lpsz[MAX_PATH+1];

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

这在运行 Windows XP 和更早版本的计算机上完美运行。我没有在 Vista 中对此进行测试,但在 Windows 7 上,lpsz 会在其中插入垃圾 unicode 字符(有时也会插入实际文本)。知道这里发生了什么吗?

【问题讨论】:

    标签: c++ windows visual-c++ windows-7 mfc


    【解决方案1】:

    既然您使用的是 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 中看到的无意义字符。

    【讨论】:

    • 这里有一点风险。如果另一个线程可能会在长度查询和实际查询之间更改编辑控件的窗口文本以获取该行。最好使用 GetLine 的返回值来确保您必须是刚刚复制的文本版本的实际长度。 (诚​​然,这在大多数 GUI 代码中非常罕见。)
    • @Adrian:也许吧,但不是“非常罕见”,我会说这只是一个“错误”。在这种情况下,您希望应用程序失败,因此您知道自己无意中从单独的线程访问 UI 控件。
    • 如果您的设计说控件只能从特定线程访问,那么,是的,这将是一个错误。并非所有的 GUI 代码都是这样设计的。 GetWindowText(它是 CEdit::GetLine 的基础)专门设计用于处理从另一个线程甚至另一个进程获取文本。
    【解决方案2】:

    它不是以 null 结尾的。你需要这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多