Windows 在处理TB_GETBUTTONTEXT时,谁负责放置空终止符?

Windows 在处理TB_GETBUTTONTEXT时,谁负责放置空终止符?,windows,winapi,visual-c++,memory-management,Windows,Winapi,Visual C++,Memory Management,的文档说明,处理程序必须返回字符数,并且可以选择(如果lParam不为null)将字符串复制到提供的缓冲区中 需要注意的是,长度不包括终止字符。我看到以下问题。假设处理程序存储预计算的字符串(因此其长度不会更改)。首先,调用者发送消息时,lParam设置为null,以查找字符数,处理程序返回字符数,而不终止null。然后调用者分配内存并再次发送消息-这次将缓冲区地址作为lParam传递 处理程序是否应该复制终止null?我的意思是,如果处理程序第一次返回N,调用程序为N字符分配了空间,并且处理程

的文档说明,处理程序必须返回字符数,并且可以选择(如果
lParam
不为null)将字符串复制到提供的缓冲区中

需要注意的是,长度不包括终止字符。我看到以下问题。假设处理程序存储预计算的字符串(因此其长度不会更改)。首先,调用者发送消息时,
lParam
设置为null,以查找字符数,处理程序返回字符数,而不终止null。然后调用者分配内存并再次发送消息-这次将缓冲区地址作为
lParam
传递

处理程序是否应该复制终止null?我的意思是,如果处理程序第一次返回
N
,调用程序为
N
字符分配了空间,并且处理程序附加了一个终止null,那么就会发生缓冲区溢出。但是,如果调用方确实希望字符串以null结尾,并为
N+1
字符分配空间,并且处理程序没有附加null结尾符,那么处理程序将拥有一个未以null结尾的字符串,并且可能再次发生缓冲区溢出(如果调用方不够小心)


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

MFC在其CMFCToolBar::OnGetButtonText()实现中使用sane方法,它假设调用方知道它应该分配N+1,并使用lstrcpy()复制文本