Как создать собственную DLL средствами Visual Basic?
Техника объектно-ориентированного программирования хороша тем, что позволяет многократно и эффективно использовать созданные вами программные компоненты. В этой статье рассказывается, как создавать классы в VB. С помощью классов можно разрабатывать объекты и таким образом извлекать пользу из техники объектно-ориентированного программирования. При работе над большими проектами каждый участник, например, может создавать определенный класс и скомпилировать его в библиотеку ActiveX DLL, тем самым сделав его доступным для использования другими членами команды. Если вам приходилось использовать стандартные элементы управления VB, то вы уже знакомы с классами и объектами. Когда вы помещаете в форму текстовое поле, то в действительности создаете экземпляр класса текстового поля. Если вы поместили в форму пять текстовых полей - это значит, что вы создали пять экземпляров класса текстового поля. Несмотря на то, что эти экземпляры различны, все они создаются по одному шаблону.Экземпляры класса - это объекты. Каждый класс представляет собой шаблон, по которому создаются объекты определенного типа. Например, класс текстового поля определяет, что текстовое поле имеет свойство Text. Однако само по себе определение класса не содержит никакой информации о значениях свойств. Именно объект, например txtLastName, который вы создаете из этого класса, будет содержать конкретную информацию.
Объектно-ориентированное программирование (ООП) применяется для построения программы из многократно используемых объектов. Как и любой другой вид программирования, ООП начинается со стадии разработки, когда вы определяете объекты и их применение. Чтобы проект можно было считать объектно-ориентированным, объекты должны удовлетворять некоторым требованиям. Фундаментальные концепции ООП можно свести к следующему:
- Инкапсуляция - или сокрытие информации означает, что объекты скрывают детали своей работы. Например, когда вы используете свойство Text текстового поля, вы не знаете (и не заботитесь) о том, как прорисовываются буквы в текстовом поле. Сокрытие информации позволяет разработчику объекта изменять внутренние принципы его функционирования, не оказывая при этом никакого влияния на пользователя объекта.
- Наследование. Новый объект можно определить на основе уже существующих объектов, при этом он может содержать те же методы и свойства. Например, вы можете создать новый объект, содержащий все стандартные свойства и методы существующего объекта и несколько дополнительных свойств и методов. От вас требуется всего лишь добавить свои свойства, а существующие будут просто "наследоваться". Строго говоря, Visual Basic не поддерживает наследование.
- Полиморфизм. Многие объекты могут иметь одноименные методы, которые могут выполнять различные действия в разных объектах. Благодаря полиморфизму, программа выполняет метод, соответствующий текущему объекту. Например, оператор "+" может использоваться как для строковых, так и для целых переменных. Несмотря на то, что в обоих случаях применяется один и тот же символ, VB знает, что он определяет совершенно разные операции.
Важной особенностью ООП-подхода является многократно используемый программный код. В основном многократное использование объекта обеспечивается его интерфейсом, т.е. методами и свойствами, посредством которых объект взаимодействует с окружающим миром. Построив объект с хорошо продуманным интерфейсом, в дальнейшем можно легко изменить его внутренюю функциональность или даже добавить новый интерфейс, никоим образом не повлияв на использующие этот объект программы.
Закончим со скучной теорией и перейдем к более интересной практике.
Чтобы создать ActiveX DLL, вам нужно поместить свой класс в проект типа ActiveX DLL. Проще всего создать проект этого типа, выбрав в диалоговом окне New Project пиктограмму ActiveX DLL. Visual Basic автоматически создаст в новом проекте модуль класса под именем Class1. Переименуйте его в более удобное clsTagInfo. Ниже приводится текст класса, позволяющего считывать и записывать теги ID3v1 файлов формата MP3. Подробнее о MP3 и тегах вы можете почитать
Option Explicit "объявление переменных
Dim sStr As String * 128
Dim HasTag As Boolean " флаг наличия или отсутствия тега
Private varFileName As String " имя файла
Private Type ID3" объявление пользовательского типа, описывающего тег
sTitle
sArtist
sAlbum
sYear
sComment
sTrack(1)
sGenre
End Type
Dim info As ID3
Private Function Read()" функция, считывающая тег
Dim nFile As Integer " номер файла
Dim Tag As String * 3
On Error Resume Next" не останавливать программу при ошибке
nFile = FreeFile" получаем номер свободного файла
Open varFileName
Get nFile, LOF(nFile) - 127, sStr " записываем 127 последних символов файла в переменную sStr
Close nFile " закрываем файл
Tag = Mid(sStr, 1, 3) " ищем метку тега ID3v1
If Tag = "TAG" Then " если метка есть
HasTag = True " присваиваем флагу Истина
Else
HasTag = False " если нет метки, то флаг - Фальшь
End If
If HasTag = True Then " разбиваем тег на отдельные составляющие
info.sTitle = Mid(sStr, 4, 30)
info.sArtist = Mid(sStr, 34, 30)
info.sAlbum = Mid(sStr, 64, 30)
info.sYear = Mid(sStr, 94, 4)
info.sComment = Mid(sStr, 98, 28)
info.sTrack(1) = Asc(Mid(sStr, 127, 1))
info.sGenre = Asc(Mid(sStr, 128, 1))
End If
End Function
Public Function Save() " функция, записывающая в файл новый тег
Dim nFile
info.sTrack(0) = 0
nFile = FreeFile
If HasTag = True Then " если тег есть
Open varFileName For Binary As nFile " открываем файл
Put nFile, LOF(nFile) - 124, info " записываем тег
Close nFile " закрываем файл
Else " если тега нет
Open varFileName For Binary As nFile " открываем файл
Put nFile, LOF(nFile) - 127, "TAG" " записываем метку тега
Close nFile " закрываем файл
Call Save " выполняем рекурсию
End If
End Function
" для доступа к классу используем процедуры свойств Property Get и Property Let
Public Property Get Title() As String
Title = Trim(info.sTitle)
End Property
Public Property Let Title(ByVal vNewValue As String)
info.sTitle = vNewValue
End Property
Public Property Get FileName() As String
End Property
Public Property Let FileName(ByVal vNewValue As String)
varFileName = vNewValue
Read
End Property
Public Property Get Artist() As String
Artist = Trim(info.sArtist)
End Property
Public Property Let Artist(ByVal vNewValue As String)
info.sArtist = vNewValue
End Property
Public Property Get Album() As String
Album = Trim(info.sAlbum)
End Property
Public Property Let Album(ByVal vNewValue As String)
info.sAlbum = vNewValue
End Property
Public Property Get Year() As String
Year = Trim(info.sYear)
End Property
Public Property Let Year(ByVal vNewValue As String)
info.sYear = vNewValue
End Property
Public Property Get Comment() As String
Comment = Trim(info.sComment)
End Property
Public Property Let Comment(ByVal vNewValue As String)
info.sComment = vNewValue
End Property
Public Property Get Track() As Variant
Track = info.sTrack(1)
If Track = 0 Then Track = ""
End Property
Public Property Let Track(ByVal vNewValue As Variant)
If Not IsNumeric(vNewValue) Or vNewValue > 255 Then
MsgBox "Введите цифру не больше 255"
Else
info.sTrack(1) = vNewValue
End If
End Property
Public Property Get Genre() As Variant
Genre = info.sGenre
End Property
Public Property Let Genre(ByVal vNewValue As Variant)
info.sGenre = vNewValue
End Property
Скомпилируйте библиотеку, например, TagInfo.dll. Для использования библиотеки в своих проектах, её необходимо зарегистрировать в реестре, например, "regsvr32.exe TagInfo.dll". Также её нужно подключить к текущему проекту с помощью диалогового окна References. Пример использования:
Private Sub Form_Load()
Dim info As clsTagInfo
Set info = New clsTagInfo
info.FileName = "C:/Music/ролл.mp3"
cboGenre.ListIndex = info.genre
txtAlbum.Text = info.Album
txtArtist.Text = info.Artist
txtComment.Text = info.Comment
txtTitle.Text = info.Title
txtTrack.Text = info.Track
txtYear.Text = info.Year
End Sub