CodeNet / Платформы / Windows / DLL
Создание DLL на Visual Basic
http://www.vbcorner.narod.ru/
DLL (Dynamic Link Library) - динамически подключаемые библиотеки представляют собой совокупность процедур и функций, которыми могут пользоваться внешние программы. Причем одну и ту же библиотеку можно подключить к любому языку программирования т.е. библиотеки, написанные на одном языке программирования можно использовать на других языках. DLL делятся на обычные и ActiveX. Основное отличие ActiveX DLL от обычной - это интерфейс, который связывает вызывающую программу с библиотекой. Такая DLL подключается к программе в процессе разработки и Вы можете увидеть все ее свойства и методы. Процедуры же из обычной DLL вызываются в процессе выполнения программы. Примером могут послужить такие библиотеки как Shell32.dll, User32.dll и т.д., включающие в себя всем известные API функции. VB может создавать только ActiveX библиотеки. Стоит отметить, что с появлением VS.NET ActiveX библиотеки стали называть COM объектами.
Итак приступим к созданию библиотеки. Откройте стандартный проект: File->New Project->Standard EXE. В этом проекте будут тестироваться созданные в DLL проекте функции. Затем добавьте новый проект - ActiveX DLL: File->Add Project->ActiveX DLL. В простейшем случае проект ActiveX DLL состоит из одного модуля класса. По сути, модуль класса представляет собой объект, включающий свойства, методы и события. Теперь придумаем название DLL проекту. В окне Project Explorer выберете Project2. В окне свойств введите имя TestDLL. Подключим эту библиотеку к первому проекту. Перейдите к первому проекту щелкнув два раза по Project1 в окне Project Explorer. Откройте окно Object Browser. Затем щелкните по нему правой кнопкой мыши и выберите в появившемся меню пункт References:
Появится окно References, где перечислены все зарегистрированные ActiveX библиотеки. Там же будет находиться и проект TestDLL. Отметьте его галочкой тем самым включив его в первый проект и нажмите OK:
Напишем первую функцию. Пусть она будет представляет собой сумму двух целых чисел. В окне кода модуля класса введите:
Public Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer Sum = a + b End Function
Итак первая функция готова. Перейдите в окно кода формы первого проекта и введите
Private Sub Form_Load() Dim Class As New Class1 MsgBox Class.Sum(10, 5) End Sub
При запуске программа покажет 15. Обратите внимание на первую строчку, где происходит связывание переменной Class с классом библиотеки Class1. Это называется ранней привязкой. Аналогично можно было бы использовать позднюю привязку:
Dim Class As Class1 Set Class = New Class1
В данном случае позднюю привязку использовать неуместно. Но существуют случаи, когда без поздней привязки не обойтись. Теперь создадим метод чуть посложнее. Этот метод будет закрашивать указанное окно градиентной заливкой, переходящей из зеленого в синий цвет. Введите в модуле класса следующий код:
Public Sub GradientFill(ByVal Pic As Object) Dim i As Integer Dim d As Single Pic.ScaleMode = vbPixels Pic.AutoRedraw = True For i = 0 To Pic.ScaleWidth - 1 d = i / Pic.ScaleWidth Pic.Line (i, 0)-(i, Pic.ScaleHeight - 1), _ RGB(0, 255 - CByte(255 * d), CByte(255 * d)) Next End Sub
Чтобы воспользоваться этим методом введите в окне кода формы первого проекта:
Private Sub Form_Load() Dim Class As New Class1 Class.GradientFill Form1 End Sub
Теперь создадим свойство для класса:
Dim m_Text As String Public Property Get Text() As String Text = m_Text End Property Public Property Let Text(ByVal New_Text As String) m_Text = New_Text End Property
Как Вы видите выше, для создания свойства используются две процедуры: Property Get и Property Let. Первая процедура вызывается, когда внешняя программа запрашивает значение свойства, а вторая - когда внешняя программа изменяет значение свойства. Конечно, в данном случае все это можно было бы заменить одной строкой:
Public Text as String
Но использование отдельных процедур удобно, когда при запросе/присвоении свойству нового значения требуется выполнить какое-либо действие. К примеру видоизменим приведенный выше текст следующим образом:
Dim m_Text As String Public Property Get Text() As String Text = m_Text End Property Public Property Let Text(ByVal New_Text As String) MsgBox "Вы задали новое значение для свойства Text" m_Text = New_Text End Property
Теперь введите в коде формы первого проекта:
Private Sub Form_Load() Dim Class As New Class1 Class.Text = "helloword" End Sub
При запуске программы появится окошко с сообщением об изменении свойства.
Сделаем свойство посложнее на основе выше приведенной градиентной заливки. При запросе значения свойства будут возвращаться цвета границ заливки, а при задании значения для свойства форма будет закрашиваться градиентной заливкой:
' Таким образом можно объявить ' в модуле класса глобальные константы Public Enum FillConst RedGreen = 1 GreenRed = 2 RedBlue = 3 BlueRed = 4 GreenBlue = 5 BlueGreen = 6 End Enum Dim m_FormFill As FillConst Public Property Get FormFill(Pic As Object) As FillConst FormFill = m_FormFill End Property Public Property Let FormFill(Pic As Object, ByVal New_FormFill As FillConst) Dim i As Integer Dim d As Single Dim Color As Long Pic.ScaleMode = vbPixels Pic.AutoRedraw = True ' Закрашиваем форму For i = 0 To Pic.ScaleWidth - 1 d = i / Pic.ScaleWidth Select Case New_FormFill Case RedGreen Color = RGB(255 - CByte(255 * d), CByte(255 * d), 0) Case GreenRed Color = RGB(CByte(255 * d), 255 - CByte(255 * d), 0) Case RedBlue Color = RGB(255 - CByte(255 * d), 0, CByte(255 * d)) Case BlueRed Color = RGB(CByte(255 * d), 0, 255 - CByte(255 * d)) Case GreenBlue Color = RGB(0, 255 - CByte(255 * d), CByte(255 * d)) Case BlueGreen Color = RGB(0, CByte(255 * d), 255 - CByte(255 * d)) End Select Pic.Line (i, 0)-(i, Pic.ScaleHeight - 1), Color Next ' Изменяем значение свойства m_FormFill = New_FormFill End Property
Чтобы воспользоваться данным свойством введите в окне кода формы:
Private Sub Form_Load() Dim Class As New Class1 ' Закрашиваем форму градиентной заливкой ' переходящей из красного в зеленый цвет Class.FormFill(Form1) = RedGreen ' Выводим текущий цвет заливки ' В нашем случае 1 ' соответствующий константе RedGreen MsgBox Class.FormFill(Form1) End Sub
Теперь рассмотрим события. В качестве примера сделаем событие, отслеживающее перемещение формы по экрану:
' Объявляем событие Public Event FormMove(Left As Single, Top As Single) Public Sub Begine(Form As Object) Dim Left As Single, Top As Single Left = Form.Left Top = Form.Top Do ' Если координаты формы не соответствуют ' прежним, то генерируем событие FormMove If Left Form.Left Or Top Form.Top Then Left = Form.Left Top = Form.Top RaiseEvent FormMove(Left, Top) End If ' Передаем управление другим процедурам DoEvents Loop End Sub
Теперь поместите на форму две надписи (Label) и введите следующий код:
' Таким образом объявляются классы, содержащие события Dim WithEvents Class As Сlass1 Private Sub Form_Load() Set Class = New Сlass1 ' Показываем форму Form1.Show ' Запускаем процедуру для отслеживания события перемещения формы Class.Begine Form1 End Sub Private Sub Class_FormMove(Left As Single, Top As Single) ' При перемещении формы отображаем ее координаты Label1 = Left Label2 = Top End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) End End Sub
Помимо классов DLL могут также включать в себя формы, которые могут использоваться в качестве диалоговых окон. Для примера создадим диалоговое окно выбора цветов. Для этого в DLL проект добавьте форму. На форму поместите два PictureBox и одну кнопку. В окне свойств укажите у формы свойство BorderStyle = Fixed Dialog, а Caption = Выбор цвета. В результате форма должна выглядеть примерно так:
Окошко слева назовите Picture1, окошко справа - Picture2. В окно кода этой формы введите:
Private Sub Form_Load() Dim i As Integer, j As Integer Dim b1 As Single, b2 As Single Picture1.AutoRedraw = True Picture1.ScaleMode = vbPixels For i = 0 To Picture1.ScaleWidth - 1 For j = 0 To Picture1.ScaleHeight - 1 b1 = 255 / Picture1.ScaleWidth b2 = 255 / Picture1.ScaleHeight Picture1.PSet (i, j), RGB(255 - CByte(b1 * i), CByte(b1 * i), CByte(b2 * j)) Next Next End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Picture2.BackColor = Picture1.Point(X, Y) End Sub Private Sub Command1_Click() Form1.Hide End Sub В окно кода модуля класса введите: Public Function GetColor() As Long Form1.Show vbModal GetColor = Form1.Picture2.BackColor End Function
Таким образом функция GetColor вызовет диалоговое окошко выбора цвета, а затем возвратит выбранный цвет. В качестве примера использования данной функции в окне кода формы первого проекта введите:
Dim Class As New Class1 Private Sub Form_Click() Form1.BackColor = Class.GetColor End Sub
После того как библиотека будет готова ее нужно откомпилировать. Выберете DLL проект в окне Project Explorer. Затем File->Make TestDLL.dll. Откомпилированную библиотеку можно будет использовать в любой Вашей программе на любом языке программирования, поддерживающем ActiveX. Подключение библиотеки производится также как описывалось выше при работе двух проектов.