/ / Кой е отговорен за пускането на нулев терминатор при работа с TB_GETBUTTONTEXT? - прозорци, winapi, visual-c ++, управление на паметта

Кой отговаря за поставянето на нулевия терминатор при работа с TB_GETBUTTONTEXT? - windows, winapi, visual-c ++, управление на паметта

Документацията за TB_GETBUTTONTEXT казва, че манипулаторът трябва да върне броя на символите и по желание (ако lParam не е нула) копирайте низа в предоставения буфер.

Уговорката е, че дължината не включвапрекратяващ характер. Виждам следния проблем. Да кажем, че манипулаторът съхранява предварително зададения низ (така че дължината му не се променя). lParam настройте на нула - за да намерите броя на знаците -и манипулаторът връща броя на символите без крайната нула. След това повикващият разпределя памет и изпраща съобщението отново - този път преминавайки буферния адрес като lParam.

Трябва ли манипулаторът да копира прекратяващия null? Искам да кажа, че когато за първи път ръководителят се върне N и обаждащият се разпредели място за N символи и манипулаторът добавя прекратяващ null, след което се превишава буфера. Но ако повикващият наистина е очаквал, че низът ще бъде null, ще бъде прекратен и ще му бъде отпуснато място N+1 символите и манипулаторът не добавя нулевия терминатор, а манипулаторът ще има низ, който не е прекъснат с нула и отново може да се получи превишаване на буфера (ако повикващият не е достатъчно внимателен).

И така, какво трябва да направи водачът? Трябва ли да копира нулевия терминатор или не?

Отговори:

2 за отговор № 1

MFC използва разумния подход в реализацията на CMFCToolBar :: OnGetButtonText (), предполага, че повикващият знае, че трябва да разпредели N + 1 и използва lstrcpy (), за да копира текста.