Вверх ↑
Ответов: 3889
Рейтинг: 362
#1: 2011-06-28 15:29:39 ЛС | профиль | цитата
nesco писал(а):
интересно, а где у тебя вылетит новый метод Read


WinExec -> LStrSetLength -> ReallocMem -> SysReallocMem -> SysGetMem -> TryHarder -> InsertFree (system) -> опять попытка записи в недопустимый адрес

Покопавшись в машинном коде приходим к выводу, что это - скомпилированная 118-я строка WinExec:

SetLength(pBuffer, Total);

Физически история проблемы такая же - менеджер памяти обращается к области памяти за пределами допустимого адресного пространства и благополучно улетает.
------------ Дoбавленo в 15.29:
Кстати, это объясняет, почему поведение разное на разных операционных системах и даже на одной. Менеджер памяти обращается к адресам с очень большим разбросом. Некоторые - действительно попадают в доступный ему сегмент данных и ошибки не происходит, туда попадают нужные данные и всё работает. Некоторые попадают в сегменты, доступные, но защищённые - происходит исключение по ошибке №204 самого паскаля. Некоторые обращения попадают на защищённые системой области памяти и вылетает дебаггер (если он у Вас стоит).

Вполне верю, что на некоторых системах с большим количеством оперативной памяти и современным ядром NT6.x , в котором улучшен менеджер памяти, может работать. Там ещё и механизмы многопоточности физически по-другому реализованы.
карма: 1

0