代码之家  ›  专栏  ›  技术社区  ›  sharptooth

谁负责在处理tb getbuttonText时放置空终止符?

  •  1
  • sharptooth  · 技术社区  · 14 年前

    文件 TB_GETBUTTONTEXT 表示处理程序必须返回字符数和可选的(如果 lParam 不为空)将字符串复制到提供的缓冲区中。

    警告是长度不包括终止字符。我看到以下问题。假设处理程序存储预计算的字符串(这样它的长度就不会改变)。首先,呼叫者用 拉帕姆 设置为空-以查找字符数-处理程序返回不带终止空值的字符数。然后调用者分配内存并再次发送消息-这次将缓冲区地址作为 拉帕姆 .

    处理程序是否应复制终止的空值?我是说如果第一次处理程序返回 N 呼叫方为 n 字符和处理程序附加一个终止的空值,然后发生缓冲区溢出。但如果调用者真的希望字符串为空,则终止并为其分配空间 N+1 字符和处理程序没有附加空终止符,处理程序将有一个非空终止的字符串,并且可能再次发生缓冲区溢出(如果调用程序不够小心)。

    那么,处理程序应该做什么呢?它是否应该复制空终止符?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Hans Passant    14 年前

    MFC在其cmfctoolbar::OnGetButtonText()实现中使用SANE方法,它假定调用方知道应该分配N+1,并使用lstrpy()复制文本。