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