Записване на CD-DVD дискове в Delphi - всичко за ИТ и програмиране
Написано на 30 януари 2009 г. Публикувано в Delphi
Технологията, която ще бъде описана в тази статия, е технологията IMAPI v2.0. Не е възможно тази технология да се опише в една статия, така че тази статия ще опише само основите на работа с IMAPI2. Тази технология е доста нова и се поддържа от операционни системи Windows XP SP2, 2003 Server, Vista и др. Тези. преди да използвате технологията IMAPI2, трябва да се уверите, че операционната система на компютъра, на който ще работи програмата, е поне една от горните или по-нова (например Windows 7). „Имитацията“ на IMAPI2 са две библиотеки imapi2.dll и imapi2fs.dll. Преди да използвате тази технология, вие или програмата, която ще работи на компютъра, трябва да се уверите, че тези две DLL файлове съществуват. Ако те не са там, тогава трябва да инсталирате актуализацията KB932716 от сайта на Microsoft.com (вижте връзките за изтегляне на актуализацията, както и актуализацията за Win XP, в края на статията).
И така, ние се уверихме, че IMAPI v2 се поддържа от операционната система. Сега се нуждаем от заглавни файлове или по-скоро трябва да инсталираме компонентите за запис на дискове. За C++ програмистите тази част е по-лесна, тъй като Platform SDK има заглавни файлове и те трябва да бъдат включени само за да използват класовете за записване на дискове. Но в Delphi също не е много трудно, в Delphi трябва да импортирате библиотеката с типове. След като импортира библиотеката с типове, Delphi сам ще създаде компоненти и класове за запис на дискове и ще ги инсталира в палитрата. Какво трябва да направим за това. Обяснявам как да импортирам библиотеката с типове за потребители на Delphi 7. Изберете меню Проект -> Импортиране на библиотека с типове. В прозореца, който се отваря, в списъка намираме „Microsoft IMAPI2 BaseФункционалност (Версия 1.0)“, поставете отметка в квадратчето „Генериране на обвивка на компонент“ в долната част (отметнато е по подразбиране), щракнете върху бутона „Инсталиране“. Изберете раздела „В нов пакет“ и изберете файла, в който ще бъде записан пакетът, натиснете бутона OK. След това съветникът веднага ще предложи да инсталирате тези компоненти, щракнете върху „Да“ след инсталирането, рестартирайте Delphi. По подразбиране новите компоненти трябва да се инсталират в раздела ActiveX. След това правим същото с елемента „Microsoft IMAPI2 File System Image Creator (Version 1.0)“.
И така, компонентите са инсталирани, можете да програмирате. Както вече споменахме, самият Delphi създава класове и компоненти, които са обвивки около съответните COM интерфейси, което опростява програмирането възможно най-много. Но има един минус. Ако използваме интерфейси директно, тогава ако техните методи се провалят, тогава те просто връщат грешка; когато използваме „Делфийски“ класове, тогава методите на класа хвърлят изключения, ако се провалят, така че се препоръчва да включите извиквания на метод и важни секции на кода в блокове try/except. По време на дебъгване (когато стартираме програмата с натискане на клавиша F9) все още се показват съобщения за грешка, което е доста неприятно. Тази статия ще опише методите на COM интерфейсите, тъй като знаейки методите и имената на COM интерфейсите, ще можем да пишем програми не само в Delphi, но и в C ++ и VB. Методите и свойствата на компонентите на Delphi няма да бъдат описани, тъй като всичко в тях е интуитивно и просто.
Първото нещо, което трябва да направите, е да получите списък с устройства, които могат да записват дискове и които могат да бъдат достъпни чрез IMAPI2. Това може да стане чрез интерфейса IDiscMaster2. Първото нещо, което трябва да знаем е дали поне едно устройство в системата поддържа записдискове и може да бъде достъпен чрез интерфейса IMAPI2. За да направите това, извикайте метода IDiscMaster2::get_IsSupportedEnvironment. Ако получим резултата верен, тогава системата има поне едно подходящо устройство за нас. За да получите общия брой устройства в системата, извикайте метода IDiscMaster2::get_Count. За да получите уникален идентификатор на устройство, извикайте метода IDiscMaster2::get_Item.
Следващата стъпка е да инициализираме устройството и да получим информация от него, засега имаме нужда само от VendorId и ProductId на устройството. Именно тези два реда ни дават името на устройството, което се показва в диспечера на устройствата. За да получите тези два идентификатора, трябва да извикате методите IDiscRecorder2::get_VendorId, IDiscRecorder2::get_ProductId. Разбира се, първо трябва да извикате метода IDiscRecorder2::InitializeDiscRecorder, който приема уникален идентификатор на устройство, получен от метода IDiscMaster2::get_Item.
Така че, нека се занимаваме със самия "делфей". Поставяме компонентите TMsftDiscMaster2 и TMsftDiscRecorder2 във формата. След това ще дам кода за получаване на списък с достъпни за нас рекордери:
В падащия списък ще бъдат изброени всички налични автори. Ако някое записващо устройство не е налично, вместо името му ще се покаже "-".
Отиваме по-нататък, намерихме рекордера, от който се нуждаем, сега трябва да създадем дисково изображение за запис. Интерфейсът IFileSystemImage е отговорен за създаването на изображението. Файловете и папките в този интерфейс са представени от интерфейсите IFsiFileItem и IFsiDirectoryItem. За да получите основната папка, извикайте метода IFileSystemImage::get_Root. След като сте получили интерфейса на основната папка, можете безопасно да добавяте файлове и папки към изображението. Има няколко метода за добавяне на файлове и папки към изображение, ще опиша най-простия от тях.
За да добавите папка с всички нейни файловеудобно е да използвате метода IFsiDirectoryItem::AddTree, към него трябва да се подадат два параметъра. Първият параметър е пътят до папката, вторият параметър е от тип Boolean, ако е true, тогава самата папка и всички файлове и папки, съдържащи се в нея, ще бъдат добавени към изображението, ако параметърът е false, тогава само файловете и папките, съдържащи се в търсената папка, ще бъдат добавени към изображението (търсената папка няма да бъде добавена).
В тази функция се интересуваме само от два параметъра, първия и последния. Първият параметър е пътят до търсения файл, последният параметър ще запази потока със съдържанието на файла. Сега можете да пишете код, който създава изображение на диск от файловете с пътеки, които са изброени в ListBox
Почти забравих, за да зададете името на диска, трябва да извикате метода IFileSystemImage:: put_VolumeName. За да зададете настройките на файловата система в зависимост от това кой диск е поставен в устройството, извикайте метода IFileSystemImage::ChooseImageDefaults, предавайки интерфейса IDiscRecorder2.\ като параметър.
Продължавайки по-нататък, за да създадете полученото изображение, трябва да извикате метода IFileSystemImage::CreateResultImage. След като го извикаме, ще получим интерфейса IFileSystemImageResult. За да записваме, имаме нужда от неговия IStream, за това трябва да извикаме метода IFileSystemImageResult::get_ImageStream.
Получихме полученото изображение, остава само да го запишем. Интерфейсът IDiscFormat2Data отговаря за писането на изображението. Има и интерфейси IDiscFormat2RawCD, IDiscFormat2TrackAtOnce, IDiscFormat2Erase (за изтриване на дискове), работата с тях е подобна на работата с IDiscFormat2Data.
За да зададете устройството, на което ще се прави записът, извикайте метода IDiscFormat2Data::put_Recorder. За да започнете да записвате диск, трябва да извикате метода IDiscFormat2Data::Write, като го подадете като параметърIStream със съдържанието на образа на диска. Сега можете да напишете функция, която записва файлове и папки, посочени в ListBox, на диск.
Изглежда, че е всичко. Остава само да се покаже текущото състояние на записа. За да направим това, трябва да създадем наш собствен интерфейс с метода Update.
Параметърът на обекта сочи към текущия интерфейс IDiscFormat2Data, който записва. Параметърът за прогрес сочи към интерфейса IDiscFormat2DataEventArgs, съдържащ текущото състояние на записа. Интерфейсът IDiscFormat2DataEventArgs е наследник на интерфейса IWriteEngine2EventArgs. Преди да запишете диск, е необходимо да свържете интерфейса, който създадохме с манипулатора, към интерфейса IDiscFormat2Data. За щастие, съветникът на Delphi се отърва от тази караница и създаде компоненти със свойства на събитието, така че настройването на ваш собствен манипулатор е толкова лесно, колкото настройването на манипулатор за щракване на бутон. Няма смисъл да се дава пълният код на манипулатора, така че следното е само кодът, който показва текущия напредък: