Создание DLL на VB

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. Подключение библиотеки производится также как описывалось выше при работе двух проектов.
Hosted by uCoz