DLL – це просто, Basic, Програмування, статті

Михайло Ескін

Перш ніж почати роботу з конкретним прикладом я б хотів спочатку трохи докладніше зупинитися, що ж таке dll в VB. DLL, створений в VB, відрізняється від DLL, створених на С + +, як небо і земля. Щоб скористатися бібліотекою, написаної на С, необхідно задекларувати конкретну функцію в конкретній бібліотеці, і можна користуватися. Ці бібліотеки представляють іноді такі можливості, які відсутні в самому VB.

Бібліотеки, написані на VB, незважаючи на однакове розширення файлів, структурно принципово відрізняються. Це, так звані, ActiveX DLL. І, виходячи з їхньої назви, працюють, як і будь-яке інше ActiveX-додаток. Тобто дану бібліотеку необхідно спочатку зареєструвати, щоб VB її побачив, а потім приєднати до програми. Виходячи з того, що ці бібліотеки є зовнішніми, ми отримуємо деякі обмеження при оголошенні типів даних. Наприклад, ми не можемо передати параметр з призначеним для користувача типом даних або з типом як форма або контрол (що VВ інтерпретує як все той ж користувальницький тип). Можливо, це і послужило серед програмістів причиною низької популярності даного типу додатків, створених на VB. Однак, як і будь-яке інше додаток, воно має свої плюси, наприклад можливість створення об’єктно-орієнтованого коду.

Створюючи свої програми, у кожного накопичилися небудь свої розробки, прийоми, добре налагоджені коди. І щоб їх використовувати ви починаєте зберігати їх у вигляді текстових файлів, баз даних або посилань на Інтернет. Я пропоную використовувати для цього свою бібліотеку, що підключається до будь-своєму додатком з уже відомими вам функціями.

    Крок 1. Створимо новий проект ActiveX DLL. Назвемо його MyLibrary. Клас, який створюється з даним проектом за замовчуванням, зробимо головним, назвемо MyLib, і поки закриємо. До нього ми повернемося трохи пізніше.

    Крок 2. Додамо в проект через меню Project / Add Class Module. Змінимо його назву на FrmFunct. Сюди ми будемо додавати коди функцій, пов’язаних з роботою форм. Для прикладу візьмемо можливість показу форми поверх всіх і зняття цієї можливості. Для цього в розділі декларацій оголосимо API-функцію:

Private Declare Function SetWindowPos Lib “user32” _
    (ByVal hwnd As Long, _
    ByVal hWndInsertAfter As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal cx As Long, _
    ByVal cy As Long, _
    ByVal wFlags As Long) As Long 

А тепер напишемо 2 процедури, які і виконують ці функції.

Public Sub MakeNormal(Handle As Long)
    SetWindowPos Handle, HWND_NOTOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS
End Sub

Public Sub MakeTopMost(Handle As Long)
    SetWindowPos Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS
End Sub

    Крок 3. Додамо ще один клас. Він буде відповідати у нас за роботу з ini-файлами. Відповідно дамо йому ім’я IniFunct. Оголосимо 2 API функції, що відповідають за роботу з ini-файлами

Private Declare Function WritePrivateProfileString Lib “kernel32” _
    Alias “WritePrivateProfileStringA” _
    (ByVal lpApplicationName As String, _
    ByVal lpKeyName As Any, _
    ByVal lpString As Any, _
    ByVal lpFileName As String) As Long

Private Declare Function GetPrivateProfileString Lib “kernel32” _
    Alias “GetPrivateProfileStringA” _
    (ByVal lpApplicationName As String, _
    ByVal lpKeyName As Any, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Long, _
    ByVal lpFileName As String) As Long

і напишемо також 2 процедури.

‘Читаємо дані з ini
Public Function ReadINIKey(Section As String, KeyName As String, FileName As String) As String
    Dim RetVal As String

    RetVal = String(255, Chr(0))
    ReadINIKey = Left(RetVal, GetPrivateProfileString(Section, KeyName,
“”, RetVal, Len(RetVal), FileName))
End Function

‘Записуємо дані в ini
Public Function WriteInIKey(Section As String, KeyName As String, KeyValue As String, FileName As String)
    WritePrivateProfileString Section, KeyName, KeyValue, FileName
End Function

NB! Функції, написані в обох класах, оголошені як Public для того, щоб мати до них доступ із зовні.

    Крок 4. Повернемося до класу MyLib. Тепер настав самий час прив’язати інші класи до нього. Для цього в розділі декларацій оголосимо 2 змінні (по одній для кожного класу) з типом цього класу.

Private m_FormFunction As FrmFunct
Private m_IniFunction As IniFunct

У процедурі ініціалізації класу запустимо ці змінні, а в процедурі завершення роботи класу – не забудемо від них почистити пам’ять.

Private Sub Class_Initialize()
    Set m_FormFunction = New FrmFunct
    Set m_IniFunction = New IniFunct
End Sub

Private Sub Class_Terminate()
    Set m_FormFunction = Nothing
    Set m_IniFunction = Nothing
End Sub

Тепер оголосимо 2 властивості Property Get, відповідних кожному класу.

Public Property Get FormFunction() As FrmFunct
    Set FormFunction = m_FormFunction
End Property

Public Property Get IniFunction() As IniFunct
    Set IniFunction = m_IniFunction
End Property

Ось, власне кажучи, і все.

    Крок 5. Тепер настає один з найнеприємніших моментів – це тестування DLL. Їх можна тестувати тільки в іншому проекті. Тому запустіть на виконання наш проект, і відкрийте ще один примірник VB. Створіть проект Standard EXE. Зайдіть в меню Project / References. У діалоговому вікні знайдіть назву нашої бібліотеки. Открижте її та натисніть кнопку ОК. Ми під’єднали нашу бібліотеку до тестіровочного проекту.

NB! Якщо ви у властивостях проекту не заповнювали поле Description, то в якості назви буде за замовчуванням стояти ім’я ехе-файла. В іншому випадку буде виводитися напис з поля Description.

    Крок 6. Давайте на прикладі однієї функції покажемо, як працює наша бібліотека. У розділі декларацій оголосимо змінну з типом нашого основного класу (тобто MyLib). В Form_Load озвучимо цю змінну, а в Form_Unload не забудемо звільнити від неї пам’ять.

Private Sub Form_Load()
    Set ML = New MyLib
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set ML = Nothing
End Sub

На формі розмістимо 2 кнопки, кожній з яких призначимо функцію цього класу, що відповідає за розташування поверх вcех форм і нормального розташування.

Private Sub Command1_Click()
    ML.FormFunction.MakeTopMost Me.hWnd
End Sub

Private Sub Command2_Click()
    ML.FormFunction.MakeNormal Me.hWnd
End Sub

Запустимо проект на тестування. Ви можете додавати інші функції в ці класи або створити нові, визначивши ту структуру зберігання інформації, яку ви хочете.

NB! При компіляції бібліотеки відбувається автоматична реєстрація її на Вашому комп’ютері. Якщо ж ви переносите її на інший комп’ютер, необхідно подбати про її реєстрацію там (виконується за допомогою все того ж файлу, що і для реєстрації ОСГ – тобто regsvr32.exe, або можна скористатися моєю утилітою Reg).

Ліричний відступ. Трохи про апгрейдах. Цілком імовірно, що ви знайдете щось нове, яке перекреслить ваші попередні функції. Моя порада – не видаляйте їх. Інакше зробивши апгрейд, ви можете зіткнутися з тим, що в якісь ваші програми не будуть працювати, тому що вони спиралися на віддалені функції. Приховайте їх. Вони вам не будуть муляти очі при роботі в програмі, і разом з тим вони будуть продовжувати працювати. Для Щоб приховати функцію виберіть меню Tools / Procedure Attributes. Виберіть необхідну (-і) функцію, натисніть кнопку Advanced >> і в поле Hide this member поставте галочку. Натисніть ОК.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*