On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru


Для вас в нашей фирме kleksan недорого со скидками.




 

Форматирование диска

Между прочим, сделать это не так уж и просто.

Если вы хотите просто запустить программу Format, то можете конечно ограничиться фнкцией Shell. Например: x=Shell (format a:)   И все...

Однако, если вы злобный программист и хотите показать, что с вами шутки плохи, то этот способ вас никак не устроит по нескольким причинам. Первая - это то, что программа Format при выполнении выскакивает в окошке, а то и в полноэкранном режиме, и форматирование уж никак не останется незамеченным. Вторая - это то, что это окошко, мало того, что выскакивает на всеобщее обозрение, так еще и предлагает сначала вставить новый диск в дисковод, потом еще нажать клавишу ENTER, и наконец, когда процесс форматирования завершится, она будет справшивать метку диска.

Так вот эта статья как раз посвящена тому, как эти неприятности убрать.

Если вы не привередливый, то все может прекрасно решить одна единственная API функция WinExec, которая может исполнять различные проги под Windows и MS-DOS

Вот ее объявление:

Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, _
        ByVal nCmdShow As Long) As Long

lpCmdLine - строка, содержащая путь к программе для исполнения
nCmdShow - число, говорящее о том, как надо выводить окно (свернутым, развернутым...)

Какие значения может принимать nCmdShow:

SW_HIDE - программа спрятана, действие передано другому окну
SW_MINIMIZED - программа минимизирована (висит на панели задач). Другое окно активно
SW_RESTORE - окно развернуто до своего начального размера и позиции
SW_SHOW - окно развернуто до своего текущего размера и позиции
SW_SHOWMAXIMIZED - окно максимизировано и активно
SW_SHOWMINIMIZED - окно свернуто и активно
SW_SHOWMINNOACTIVE - окно свернуто, но активное окно не меняется
SW_SHOWNA - окно отображается в своем текущем положении и размере, но активное окно
                     не меняется
SW_SHOWNOACTIVATE - окно отображается в самом недавнем своем положении, но активное
                     окно не меняется
SW_SHOWNORMAL - окно отображается в своем оригинальном размере и положении

Значения этих констант смотрите в ApiLoader'е.

Отработав, функция WinExec возвращает значение больше 32, если все было успешно, если произошла ошибка, то функция возвратит ее код от 0 до 32:

0 - не хватает памяти
2 - файл не найден
3 - путь не найден
5 - ошибка совместного доступа
6 - каждая задача требует раздельные сегменты данных
10-неправильная версия Windows
11-неправильный EXE файл
12-нельзя выполнить приложение OS/2
13-нельзя выполнить приложение DOS 4.0
14-неизвестный EXE тип
15-защищенный режим памяти не поддерживается Windows
18-нельзя загрузить приложение защищенного режима в реальном режиме

Не знаю, понадобятся ли вам эти ошибки, но если понадобятся, то вот они.

Параметр lpCmdLine должен указывать на приложение, которое будет выполняться. Если не указан полный путь, то Windows будет производить поиск в следующем порядке:

1. Текущая папка
2. Директория Windows
3. Системная директория Windows
4. Папка, в которой находится активная программа
5. Все директории, определенные в окружении PATH
6. Сетевые директории

Функция WinExec может выполнять приложения, работающие из-под Windows или из-под DOS, с расширениями EXE, COM и BAT. Также, могут быть выполнены экранные заставки (SCR) и программно-информационные файлы (PIF).

Но вернемся к нашей задаче: отформатировать дискету. В Windows входят несколько PIF-файлов, в том числе и DOSPRMT.PIF. Этот файл говорит, какой режим надо устанавливать для исполнения задачи, например, сколько памяти надо отводить под приложение MS-DOS. Воспользовавшись этим файлом, мы можем заставить Windows выполнить команду DOS - Format. Пробовать форматировать мы будем диск A, поэтому смотрите, что есть у вас и ставьте свою букву. (Можете, конечно C, но учтите, что процесс остановить будет нельзя :)

Итак, первую проблему мы решили: с помощью функции WinExec выполнили команду format a: и запустили ее в режиме WM_HIDE, то-есть спрятали. Причем, вы не увидите процесс форматирования даже при нажатии Ctrl-Alt-Del (C-A-D)!

Но как уже говорилось, это только первая часть. Теперь, как сделать так, чтобы нас не спрашивали про всякие метки тома, действительно ли форматировать и все такое. Тут, в дело вступает автоматизация. Объясняю принцип: создается временный файл, туда запихивается последовательность клавиш, которая нажимается при форматировании, а дальше, с помощью командной строки, содержимое файла передается процессу format. И все!

Только учтите, что если вы собираетесь форматировать жесткий диск, то последовательность клавиш там будет отличная, чем если вы форматируете флоппик.

Таким образом, командная строка приобретает вид:
        format a: < c:\responce.tmp
где responce.tmp - это временный файл с набором клавиш.

Ну вот, теперь  настало время для примера. Готовый проект можно сгрузить внизу этой страницы, а сейчас я поясню несколько моментов к примеру.

Пример показывает, как форматируется диск A. С первого взгляда, я понапихал туда слишком много объектов. Ну и в самом деле, зачем там таймер? А вот зачем: вы можете создать файл responce.tmp, вызвав WinExec, запустить процесс форматирования, а затем написать Kill "c:\responce.tmp" - и это буде неправильно! Почему? Потому что пока Format будет раскочегариваться, ваша программа успеет уже раз десять удалить файл с клавишами, ведь управление из нее никуда не девается.

Я избежал этого очень хитро. Перед началом форматирования, я запомнил количество активных приложений на данный момент, затем, когда форматирование идет, количество активных приложений, естесственно, увеличилось, следовательно, проверяя каждую секунду с помощью таймера их количество и сравнивая с сохраненным, я узнаю, когда форматирование закончится и можно убивать временный файл уфф...

Конечно, при таком подходе, возможны баги, и если вы придумаете что-нть получше, напишите мне. :-]

Ну а со строкой состояния, это уже конечно прибабмбасы...

Вот и все,
приятного программирования.



Литература по Basic