© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Радиомир. Ваш
компьютер» 2/2003)
Дата последнего редактирования: 27.07.2003.
Хочу рассказать об одной истории возможно, мой опыт вам поможет.
Запускаю demo «Dive» с
В чём же дело? Может быть, в директории D:\SCENE&~1\DIVE, откуда я
копировал файлы, был
Версию о том, что причина неработоспособности сработавшая
защита от копирования, я отбросил практически сразу: защищена может быть
Может быть, программа жёстко привязана к директории D:\SCENE&~1\DIVE и
только там ищет свои файлы? Чтобы проверить это, я отключил драйвер
Тогда я попробовал зайти с другой стороны. Сообщение «Не могу найти
файл
», очевидно, появляется после того, как программа пытается
открыть
Я написал резидентную программу, которая перехватывает прерывание 21h и, если вызвана функция открытия файла, печатает значения регистров и строку, на которую указывает DS:DX, до и после вызова функции. При запуске demo эта резидентная программа напечатала следующее:
FLAGS=7046 AX=3D02 BX=A372 CX=0000 DX=A3B0 name=DIVE.PRJ FLAGS=7047 AX=0005 BX=A372 CX=0000 DX=A3B0 name=DIVE.PRJ |
То есть программа открывает файл DIVE.PRJ (который, как я сразу же проверил, присутствует на диске) для чтения и записи (AL=2). Функция завершается с ошибкой (нечётное значение регистра флагов 7047h соответствует установленному флагу C, так как этот флаг размещается в самом младшем бите регистра флагов). Код ошибки 5, что значит «нет доступа» (а вовсе не «файл не найден», чему соответствует код 2). Очевидно, программа не анализирует код ошибки и при любой ошибке выдаёт «Can not find data file».
Почему же нельзя получить доступ к файлу DIVE.PRJ для чтения и записи? Может быть, у этого файла установлен атрибут «read only» («только чтение»)?
Проверил так оно и оказалось. И после того, как этот атрибут был снят, всё заработало!
Но, позвольте, а как же тогда всё работало при запуске demo с
При запуске demo с
FLAGS=7046 AX=3D02 BX=A372 CX=0000 DX=A3B0 name=DIVE.PRJ FLAGS=7046 AX=0005 BX=A372 CX=0000 DX=A3B0 name=DIVE.PRJ |
Как видите, тот же самый вызов функции открытия файла
Кстати говоря, в рассматриваемом случае, очевидно, достаточно было открыть
файл DIVE.PRJ только для чтения: если бы программе и впрямь было бы необходимо
Итак, тайна ненайденного файла была раскрыта. После этого я вспомнил, что ранее уже сталкивался с похожей ситуацией. При запуске с винчестера (или с дискеты) ещё одного demo на экране можно было увидеть следующее:
C:\WORK\UNSORTED>verses.exe Fatal error: VERSES.EXE not found! |
Если верить этому сообщению, программа не может отыскать
собственный
Проверив атрибуты этого файла, я обнаружил, что атрибут «read only» также установлен. После его снятия и это demo нормально запустилось. Причина неработоспособности, как и в первом случае, была не в том, что программа не могла найти нужный файл, а в том, что она не могла открыть этот файл для чтения и записи.
Так что, если вы столкнётесь с аналогичной ситуацией, советую проверить
атрибуты файла (файлов) программы. В Dos Navigatorе это можно сделать,
нажав комбинацию Alt+F. Также в Dos Navigatorе удобно включить
автоматическое снятие атрибута «read only» при копировании с
Ну а при написании своих программ желательно предусмотреть, чтобы выводимые сообщения об ошибках не вводили пользователя в заблуждение