Программирование на Visual Basic

Создание 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 IntegerSum = a + bEnd Function
Итак первая функция готова. Перейдите в окно кода формы первого проекта и введите
Private Sub Form_Load()Dim Class As New Class1MsgBox Class.Sum(10, 5)End Sub
При запуске программа покажет 15. Обратите внимание на первую строчку, где происходит связывание переменной Class с классом библиотеки Class1. Это называется ранней привязкой. Аналогично можно было бы использовать позднюю привязку:
Dim Class As Class1Set Class = New Class1
В данном случае позднюю привязку использовать неуместно. Но существуют случаи, когда без поздней привязки не обойтись.Теперь создадим метод чуть посложнее. Этот метод будет закрашивать указанное окно градиентной заливкой, переходящей из зеленого в синий цвет. Введите в модуле класса следующий код:
Public Sub GradientFill(ByVal Pic As Object)Dim i As IntegerDim d As SinglePic.ScaleMode = vbPixelsPic.AutoRedraw = TrueFor i = 0 To Pic.ScaleWidth - 1d = i / Pic.ScaleWidthPic.Line (i, 0)-(i, Pic.ScaleHeight - 1), _RGB(0, 255 - CByte(255 * d), CByte(255 * d))NextEnd Sub
Чтобы воспользоваться этим методом введите в окне кода формы первого проекта:
Private Sub Form_Load()Dim Class As New Class1Class.GradientFill Form1End Sub
Теперь создадим свойство для класса:
Dim m_Text As StringPublic Property Get Text() As StringText = m_TextEnd PropertyPublic Property Let Text(ByVal New_Text As String)m_Text = New_TextEnd Property
Как Вы видите выше, для создания свойства используются две процедуры: Property Get и Property Let. Первая процедура вызывается, когда внешняя программа запрашивает значение свойства, а вторая - когда внешняя программа изменяет значение свойства. Конечно, в данном случае все это можно было бы заменить одной строкой:
Public Text as String
Но использование отдельных процедур удобно, когда при запросе/присвоении свойству нового значения требуется выполнить какое-либо действие. К примеру видоизменим приведенный выше текст следующим образом:
Dim m_Text As StringPublic Property Get Text() As StringText = m_TextEnd PropertyPublic Property Let Text(ByVal New_Text As String)MsgBox "Вы задали новое значение для свойства Text"m_Text = New_TextEnd Property
Теперь введите в коде формы первого проекта:
Private Sub Form_Load()Dim Class As New Class1Class.Text = "helloword"End Sub
При запуске программы появится окошко с сообщением об изменении свойства.
Сделаем свойство посложнее на основе выше приведенной градиентной заливки. При запросе значения свойства будут возвращаться цвета границ заливки, а при задании значения для свойства форма будет закрашиваться градиентной заливкой:
" Таким образом можно объявить" в модуле класса глобальные константыPublic Enum FillConstRedGreen = 1GreenRed = 2RedBlue = 3BlueRed = 4GreenBlue = 5BlueGreen = 6End EnumDim m_FormFill As FillConstPublic Property Get FormFill(Pic As Object) As FillConstFormFill = m_FormFillEnd PropertyPublic Property Let FormFill(Pic As Object, ByVal New_FormFill As FillConst)Dim i As IntegerDim d As SingleDim Color As LongPic.ScaleMode = vbPixelsPic.AutoRedraw = True" Закрашиваем формуFor i = 0 To Pic.ScaleWidth - 1d = i / Pic.ScaleWidthSelect 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 SelectPic.Line (i, 0)-(i, Pic.ScaleHeight - 1), ColorNext" Изменяем значение свойстваm_FormFill = New_FormFillEnd Property
Чтобы воспользоваться данным свойством введите в окне кода формы:
Private Sub Form_Load()Dim Class As New Class1" Закрашиваем форму градиентной заливкой" переходящей из красного в зеленый цветClass.FormFill(Form1) = RedGreen" Выводим текущий цвет заливки" В нашем случае 1" соответствующий константе RedGreenMsgBox 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 SingleLeft = Form.LeftTop = Form.TopDo" Если координаты формы не соответствуют" прежним, то генерируем событие FormMoveIf Left <> Form.Left Or Top <> Form.Top ThenLeft = Form.LeftTop = Form.TopRaiseEvent FormMove(Left, Top)End If" Передаем управление другим процедурамDoEventsLoopEnd Sub
Теперь поместите на форму две надписи (Label) и введите следующий код:
" Таким образом объявляются классы, содержащие событияDim WithEvents Class As Сlass1Private Sub Form_Load()Set Class = New Сlass1" Показываем формуForm1.Show" Запускаем процедуру для отслеживания события перемещения формыClass.Begine Form1End SubPrivate Sub Class_FormMove(Left As Single, Top As Single)" При перемещении формы отображаем ее координатыLabel1 = LeftLabel2 = TopEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)EndEnd Sub
Помимо классов DLL могут также включать в себя формы, которые могут использоваться в качестве диалоговых окон. Для примера создадим диалоговое окно выбора цветов. Для этого в DLL проект добавьте форму. На форму поместите два PictureBox и одну кнопку. В окне свойств укажите у формы свойство BorderStyle = Fixed Dialog, а Caption = Выбор цвета. В результате форма должна выглядеть примерно так:

Окошко слева назовите Picture1, окошко справа - Picture2. В окно кода этой формы введите:
Private Sub Form_Load()Dim i As Integer, j As IntegerDim b1 As Single, b2 As SinglePicture1.AutoRedraw = TruePicture1.ScaleMode = vbPixelsFor i = 0 To Picture1.ScaleWidth - 1For j = 0 To Picture1.ScaleHeight - 1b1 = 255 / Picture1.ScaleWidthb2 = 255 / Picture1.ScaleHeightPicture1.PSet (i, j), RGB(255 - CByte(b1 * i), CByte(b1 * i), CByte(b2 * j))NextNextEnd SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Picture2.BackColor = Picture1.Point(X, Y)End SubPrivate Sub Command1_Click()Form1.HideEnd Sub
В окно кода модуля класса введите:
Public Function GetColor() As LongForm1.Show vbModalGetColor = Form1.Picture2.BackColorEnd Function
Таким образом функция GetColor вызовет диалоговое окошко выбора цвета, а затем возвратит выбранный цвет. В качестве примера использования данной функции в окне кода формы первого проекта введите:
Dim Class As New Class1Private Sub Form_Click()Form1.BackColor = Class.GetColorEnd Sub
После того как библиотека будет готова ее нужно откомпилировать. Выберете DLL проект в окне Project Explorer. Затем File->Make TestDLL.dll. Откомпилированную библиотеку можно будет использовать в любой Вашей программе на любом языке программирования, поддерживающем ActiveX. Подключение библиотеки производится также как описывалось выше при работе двух проектов.
Hosted by uCoz