Между прочим, сделать это не так уж и просто. Если вы хотите просто запустить программу Format, то можете конечно ограничиться фнкцией Shell. Например: x=Shell (format a:) И все... Однако, если вы злобный программист и хотите показать, что с вами шутки плохи, то этот способ вас никак не устроит по нескольким причинам. Первая - это то, что программа Format при выполнении выскакивает в окошке, а то и в полноэкранном режиме, и форматирование уж никак не останется незамеченным. Вторая - это то, что это окошко, мало того, что выскакивает на всеобщее обозрение, так еще и предлагает сначала вставить новый диск в дисковод, потом еще нажать клавишу ENTER, и наконец, когда процесс форматирования завершится, она будет справшивать метку диска. Так вот эта статья как раз посвящена тому, как эти неприятности убрать. Если вы не привередливый, то все может прекрасно решить одна единственная API функция WinExec, которая может исполнять различные проги под Windows и MS-DOS Вот ее объявление: Private Declare Function WinExec
Lib "kernel32" (ByVal lpCmdLine As String, _ lpCmdLine -
строка,
содержащая
путь к
программе
для
исполнения Какие значения может принимать nCmdShow: SW_HIDE -
программа
спрятана,
действие
передано
другому
окну Значения этих констант смотрите в ApiLoader'е. Отработав, функция WinExec возвращает значение больше 32, если все было успешно, если произошла ошибка, то функция возвратит ее код от 0 до 32: 0 - не
хватает
памяти Не знаю, понадобятся ли вам эти ошибки, но если понадобятся, то вот они. Параметр lpCmdLine должен указывать на приложение, которое будет выполняться. Если не указан полный путь, то Windows будет производить поиск в следующем порядке: 1. Текущая
папка Функция 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. И все! Только учтите, что если вы собираетесь форматировать жесткий диск, то последовательность клавиш там будет отличная, чем если вы форматируете флоппик. Таким
образом,
командная
строка
приобретает
вид: Ну вот, теперь настало время для примера. Готовый проект можно сгрузить внизу этой страницы, а сейчас я поясню несколько моментов к примеру. Пример показывает, как форматируется диск A. С первого взгляда, я понапихал туда слишком много объектов. Ну и в самом деле, зачем там таймер? А вот зачем: вы можете создать файл responce.tmp, вызвав WinExec, запустить процесс форматирования, а затем написать Kill "c:\responce.tmp" - и это буде неправильно! Почему? Потому что пока Format будет раскочегариваться, ваша программа успеет уже раз десять удалить файл с клавишами, ведь управление из нее никуда не девается. Я избежал этого очень хитро. Перед началом форматирования, я запомнил количество активных приложений на данный момент, затем, когда форматирование идет, количество активных приложений, естесственно, увеличилось, следовательно, проверяя каждую секунду с помощью таймера их количество и сравнивая с сохраненным, я узнаю, когда форматирование закончится и можно убивать временный файл уфф... Конечно, при таком подходе, возможны баги, и если вы придумаете что-нть получше, напишите мне. :-] Ну а со строкой состояния, это уже конечно прибабмбасы... Вот и все, |