2010-08-10 69 views
1

TB_GETBUTTONTEXT的文檔說明處理程序必須返回字符數,並且可選地(如果lParam不爲空)將字符串複製到提供的緩衝區中。誰負責在處理TB_GETBUTTONTEXT時放置空終止符?

需要注意的是,長度不包括終止字符。我看到以下問題。說處理程序存儲預先計算的字符串(所以它的長度不會改變)。首先,調用者發送消息lParam設置爲空 - 以查找字符數 - 並且處理程序返回沒有終止空字符的數量。然後調用者分配內存並再次發送消息 - 這次傳遞緩衝區地址爲lParam

處理程序應該複製終止空嗎?我的意思是,如果第一次處理程序返回N並且調用者爲N字符分配了空間,並且處理程序追加了終止空值,則會發生緩衝區溢出。但是,如果調用者確實希望字符串被空終止併爲N+1字符分配了空間,並且處理程序不會追加空終止符,則處理程序將有一個非空終止字符串,並且可能發生緩衝區溢出(如果調用者不夠小心)。

那麼處理程序應該怎麼做?它應該複製空終止符還是不?

回答

2

MFC在其CMFCToolBar :: OnGetButtonText()實現中使用了理智的方法,它假定調用者知道它應該分配N + 1並使用lstrcpy()來複制文本。