nesco писал(а):
интересно, а где у тебя вылетит новый метод ReadWinExec -> LStrSetLength -> ReallocMem -> SysReallocMem -> SysGetMem -> TryHarder -> InsertFree (system) -> опять попытка записи в недопустимый адрес
Покопавшись в машинном коде приходим к выводу, что это - скомпилированная 118-я строка WinExec:
SetLength(pBuffer, Total);
Физически история проблемы такая же - менеджер памяти обращается к области памяти за пределами допустимого адресного пространства и благополучно улетает.
------------ Дoбавленo в 15.29:
Кстати, это объясняет, почему поведение разное на разных операционных системах и даже на одной. Менеджер памяти обращается к адресам с очень большим разбросом. Некоторые - действительно попадают в доступный ему сегмент данных и ошибки не происходит, туда попадают нужные данные и всё работает. Некоторые попадают в сегменты, доступные, но защищённые - происходит исключение по ошибке №204 самого паскаля. Некоторые обращения попадают на защищённые системой области памяти и вылетает дебаггер (если он у Вас стоит).
Вполне верю, что на некоторых системах с большим количеством оперативной памяти и современным ядром NT6.x , в котором улучшен менеджер памяти, может работать. Там ещё и механизмы многопоточности физически по-другому реализованы.