![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Порядок действий такой:
Сначала посылаем сообщение LB_GETTEXTLEN, чтобы узнать длину текста и i-ой строчке. Потом посылаем сообщение LB_GETTEXT для копирования в специально заготовленный с учётом этой длины буфер. В ВЦЛ тоже ровно так и делается. Но что меня напрягло. Вторая часть (копирование в буфер) не умеет принимать параметр "максимальная длина буфера". То есть она просто копирует до встречи с нулевым символом. А это значит, что если между узнаванием длины и копированием текста произошло что-то с этим ListBox, например, текст в i-ой строчке удлинился, то получится пресловутое переполнение буфера! Насколько мои опасения оправданы (ну может там блокировка встроена против такого, мало ли, или копируется не больше байт, чем полученно во время последнего LB_GETTEXTLEN), и как с этим делом бороться? Насколько я видел в ВЦЛ, там нет блокировки компонента на время взятия текста. -------------------- |
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Много тебе блокировка поможет? Ты от кого защититься-то хочешь? В своем приложении что-ли, на время чтения из ListBox-а обезопасить себя? Тогда EnableWindow и читай спокойно, пользователь твоей программы не изменит данные. А вот от намеренной атаки снаружи, из чужого процесса, это не спасет.
А уж если ты хочешь получать данные из чужого листбокса - так там еще веселее будет, его ж блокировать не будешь, а подсунуть оттуда тебе неправильные данные (как раз и подменить их при получении LB_GETTEXTLEN, ага, чтоб ты выделил память одного размера, а получил - другой) - вообще "как два байта переслать" (С) |
![]() ![]() |
![]() |
Текстовая версия | 8.07.2025 10:48 |