|
Работа с файлами формата
AVI.
Часть 1. Открытие и
закрытие AVI-файла.
В этом цикле статей мы
постараемся рассмотреть вопросы, связанные с созданием и обработкой
AVI-файлов при помощи функций
AVIFile, входящих в состав
Windows API.
Перед вызовом любых
AVIFile-функций, Вам нужно убедиться, что
в Вашей программе имеется вызов процедуры
AVIFileInit (в терминологии языка
C она называется функцией, возвращающей
NULL). Эта процедура заставляет
Windows подготовить библиотеку функций
AVIFile к дальнейшему использованию. После
завершения всех видов обработки AVI-файла
Вы должны вызвать процедуру AVIFileExit.
Для нашей простой
тестовой программы поместите следующую строку кода в процедуру
обработки события Form_Load:
Call AVIFileInit
'// открываем библиотеку AVIFile
А эту строку добавьте в
процедуру обработки события Form_Unload:
Call AVIFileExit
'// закрываем библиотеку AVIFile
Если Вы хотите создать
классовый модуль для работы с файлами AVI,
поместите вызов AVIFileInit в процедуру
Class_Initialize, а вызов
AVIFileExit - в процедуру
Class_Terminate. Такая структура
необходима для того, чтобы в самом начале был вызов
AVIFileInit, а по завершении работы с
AVI-функциями необходим вызов
AVIFileExit.
Кроме того, нам
необходимо получить имя AVI-файла, который
нужно открыть. На самом деле я не люблю задавать имена файлов
"жестко", в тексте самой программы, поэтому в данном случае я
включил в свой проект класс cFileDlg. Этот
класс - один из используемых мной для замены громоздкой библиотеки
Microsoft Common Dialog. Если это
действительно необходимо, Вы можете заменить этот класс вызовом
функций библиотеки Common Dialog.
Чтобы получить имя AVI-файла,
добавьте на форму Вашего проекта кнопку, и в событии обработки
нажатия этой кнопки поместите следующие строки кода:
Dim res As Long
'код возврата
Dim ofd As cFileDlg
'класс OpenFileDialog
Dim szFile As String
'имя файла
'Получаем имя
AVI-файла, с которым будем в
дальнейшем работать
Set ofd = New cFileDlg
With ofd
.OwnerHwnd = Me.hWnd
.Filter = "AVI Files|*.avi"
.DlgTitle = "Open AVI File"
End With
res = ofd.VBGetOpenFileName(szFile)
If res = False Then GoTo ErrorOut |
Этот код выводит на экран
стандартное диалоговое окно выбора файла и присваивает имя
выбранного пользователем файла переменной szFile.
Если пользователь нажал кнопку "Отмена", то программа переходит к
метке ErrorOut (ее мы добавим позднее).
Следующий шаг при
открытии AVI-файла - получить указатель на
выбранный пользователем в диалоговом окне файл. Для этого мы
используем функцию AVIFileOpen. Добавьте
следующие две строки кода в самый конец процедуры обработки события
нажатия на кнопку:
Dim pAVIFile as Long
'указатель на AVI файл
res = AVIFileOpen(pAVIFile, szFile,
OF_SHARE_DENY_WRITE, 0&) |
Обратите внимание, что
для корректного открытия AVI-файла в
функции AVIFileOpen необходимо указать
верный OF-флаг. Теперь переменная
pAVIFile будет содержать интерфейсный
указатель на AVI-файл, заданный строкой
szFile. Если функция завершилась успешно,
она вернет значение AVIERR_OK (это
константа, соответствующая числу 0).
Так как в дальнейшем мы
будем вызывать множество других
API-функций, необходимо добавить базовую
структуру обработки ошибок, чтобы программа могла корректно
завершиться при возникновении каких-либо проблем. Чтобы проверить
результат выполнения предыдущей функции, я добавил следующую строчку
сразу после вызова AVIFileOpen:
|
If res <> AVIERR_OK
Then GoTo ErrorOut |
Теперь нам нужно добавить
метку ErrorOut:, определить, какая ошибка
произошла, и корректно завершить работу программы. Корректное
завершение программы подразумевает очистку всех ресурсов, которые
могли быть использованы при вызове API-функций
и отобразить на экране соответствующее сообщение для пользователя.
Вызов AVIFileRelease позволяет закрыть
файл и очистить интерфейсный указатель pAVIFile.
Обратите внимание, что Вы должны выполнять вызов
AVIFileRelease ПОСЛЕ КАЖДОГО вызова
AVIFileOpen. Также в этом примере мы отображаем для
пользователя сообщение об ошибке. Конечно, если Вы создаете класс
обработки, то Вы можете вызвать событие появления ошибки в
клиентской программе и уже там отобразить окно сообщения. Вот
завершающий код для события обработки нажатия кнопки:
ErrorOut:
If pAVIFile <> 0 Then
Call AVIFileRelease(pAVIFile)
'//
закрываем файл
End If
If (rc <> AVIERR_OK) Then
'если произошла ошибка,
показываем сообщение пользователю
MsgBox "There was an error working with the file:" _
& vbCrLf & szFile, vbInformation, App.Title
End If |
Пока все. Теперь Вы
умеете открывать существующий AVI-файл в
VB и получать на него интерфейсный
указатель (pAVIFile). Готовый работающий
пример по этой статье можно скачать
здесь.
|