Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/225: Рейтинг темы: голосов - 225, средняя оценка - 4.73
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38174 / 21109 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 14

Создание процедурных DLL в Visual Basic (статья)

25.08.2013, 22:19. Показов 48362. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создание процедурных DLL в Visual Basic


Несколько слов о резонах создания процедурных Dll на VB. Как известно, VB позволяет без проблем создавать ActiveX-Dll. Эта возможность в целом решает проблему повторного использования кода. Однако, есть два момента, которые могут сделать использование ActiveX-Dll (т.е. COM) не вполне удобным.

Первая проблема состоит в том, что ActiveX-Dll нельзя просто скопировать - нужна регистрация (т.е. административные права). А при повсеместном внедрении политик безопасности, получение прав администратора вырастает в большую проблему. Использование процедурных dll не требует регистрации.

Вторая проблема состоит в том, что интенсивное использование кода из ActiveX-Dll (даже при раннем связывании) все-таки медленнее, чем использование кода из своей программы (или из процедурной dll) - ведь соблюдение стандарта COM требует ресурсов... И особенно больших, если используется ActiveX-Exe.

Все это делает создание процедурных dll на VB достаточно актуальным.

Теперь к делу!

Интересующиеся деталями могут прочитать мой перевод статьи
"Создание процедурных DLL в Visual Basic".

А для "занятых" могу сказать следующее:

1) Скопируйте и разверните прилагаемый архив с примерами
2) из поддиректории link-2 возьмите модуль linkk.exe; перенесите его в установочную директорию VB (она обычно располагается по адресу \Program Files\Microsoft Visual Studio\Vb98); модуль LINK.EXE переименуйте в LINKLNK.EXE,
а модуль linkk.exe -> LINK.EXE
3) Для создание dll действуйте так:

- создавайте проект ActiveX-DLL (и назовите myLib)
- модуль класса не трогайте
- добавьте в проект стандартный модуль и занесите в него следующее:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3
 
Public lastErr As Long
 
Public Function DllMain(hInst As Long, fdwReason As Long, _
  lpvReserved As Long) As Boolean
   Select Case fdwReason
      Case DLL_PROCESS_DETACH
         ' при завершении процесса ничего не делать…
      Case DLL_PROCESS_ATTACH
         DllMain = True
      Case DLL_THREAD_ATTACH
         ' перед началом потока ничего не делать…
      Case DLL_THREAD_DETACH
         ' после завершения потока ничего не делать
   End Select
End Function
 
Public Function Increment(var As Integer) As Integer
   Increment = var + 1
End Function
 
Public Function Decrement(var As Integer) As Integer
   Decrement = var - 1
End Function
 
Public Function Square(var As Long) As Long
   On Error Resume Next
   Square = var ^ 2
   If Err.Number <> 0 Then lastErr = Err.Number
End Function
 
Public Function getLastError() As Long
   getLastError = lastErr
End Function
 
Public Function ClearError() As Long
   lastErr = 0
End Function
- создайте текстовый файл myLib.def:


NAME myLib
LIBRARY MathMod
DESCRIPTION "... ..."
EXPORTS DllMain @1
Increment @2
Decrement @3
Square @4
getLastError @5
ClearError @6


- транслируйте проект обычным образом в среде IDE - получится процедурная DLL!

Для проверки работспособности DLL можно написать отдельный тестирующий модуль, в котором написать нужные операторы Declare для использования наших функций.

Все, разложенные по директориям, исходники прилагаются:
Вложения
Тип файла: zip vb_dll_proc.zip (27.2 Кб, 473 просмотров)
14
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2013, 22:19
Ответы с готовыми решениями:

Работа с DLL в Visual Basic (статья)
В данной статье описаны основные способы работы с DLL в языке программирования Visual Basic. Рассчитана прежде всего на начинающих...

Создание dll на основе Visual Basic
Помогите решить рабочую задачу: создание dll на основе visual basic. Требуется трехмерная модель с указанием переменных размеров. Размеры...

Способы передачи данных с Visual Basic в Excel (статья)
Еще по теме: 1. Тема: https://www.cyberforum.ru/visual-basic/thread681924.html 2. Тема:...

74
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 2
24.11.2015, 18:38
Студворк — интернет-сервис помощи студентам
Спасибо за ответ! Как мне уже удалось установить, что на VB6 вообще нет возможности создания 64-битных dll и видимо придется осваивать и переделывать код под VB.Net
0
Эксперт по электронике
6793 / 3220 / 335
Регистрация: 28.10.2011
Сообщений: 12,572
Записей в блоге: 7
24.11.2015, 18:49
Цитата Сообщение от Kataraksis Посмотреть сообщение
видимо придется осваивать и переделывать код под VB.Net
Он тоже не создает процедурные dll. Существует не так много бейсиков которые подходят для создания процедурных x64 DLL. Например это FreeBasic и PureBasic (статья). Может еще какие-то.
3
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.06.2017, 19:53
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?

Если да, то как правильно сформировать прототип и вызов?

Мой пример падает.
Вложения
Тип файла: zip vb_dll_proc2.zip (3.4 Кб, 57 просмотров)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.06.2017, 00:21
Цитата Сообщение от Dragokas Посмотреть сообщение
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?
Если поток и проект инициализирован то да. Нужно обратить внимание на время жизни объекта и обеспечить нахождение dll в памяти пока хоть один экземпляр класса находится в памяти. Это довольно-таки сложная задача, проще использовать стандартный механизм.
Цитата Сообщение от Dragokas Посмотреть сообщение
Если да, то как правильно сформировать прототип и вызов?
Обычно создают общий интерфейс для всех классов.
Цитата Сообщение от Dragokas Посмотреть сообщение
Мой пример падает.
Потому что никакой инициализации нет.
3
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
30.07.2017, 14:01
Почему нигде не указано, что параметры экспортируемых функций и DllMain и нужно объявлять как ByVal?
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.07.2017, 14:12
Цитата Сообщение от Замабувараев Посмотреть сообщение
параметры экспортируемых функций
Не обязательно, в зависимости от задачи.
Цитата Сообщение от Замабувараев Посмотреть сообщение
DllMain и нужно объявлять как ByVal
Да, в статье ошибка, но это почти никак не скажется на работе приведенной Dll. Там также ошибка в типе возвращаемого значения DllMain.
Гайд по созданию DLL на VB6.
2
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
02.11.2017, 09:45
Добрый день.
Заранее прошу прощения, если спрашиваю в неправильной ветке, но ответа на форму не нашёл.
Попробовал Ваш способ создания dll.
В VB6 всё отрабатывает отлично.
Но при переносе формы из Вашего проекта в Excel появляются ошибки: Добавление простых строк приводит к ошибке
Visual Basic
1
2
3
4
Public Function Increment(var As Integer) As Integer
   Increment = var + 1 'эта строка в Excel 2007 отрабатывает
   MsgBox "Не работает" 'добавление этой строки ломает всю работу
End Function
Ошибка во вложении.
Вопрос один - что не так?
Миниатюры
Создание процедурных DLL в Visual Basic (статья)  
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.11.2017, 09:50
Цитата Сообщение от Плотник Посмотреть сообщение
Вопрос один - что не так?
Это пробовал?
Цитата Сообщение от The trick Посмотреть сообщение
1
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
02.11.2017, 10:38
Цитата Сообщение от The trick Посмотреть сообщение
Это пробовал?
Сообщение от The trick
Гайд по созданию DLL на VB6.
Нет. Спасибо. Попробую.

Я, признаться, полагал, что и первоначальном примере при экспорте кода в Excel всё должно было работать - ведь вызывал-то MsgBox, не более.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
02.11.2017, 10:49
Цитата Сообщение от Плотник Посмотреть сообщение
Я, признаться, полагал, что и первоначальном примере при экспорте кода в Excel всё должно было работать - ведь вызывал-то MsgBox, не более.
Нет. MsgBox потокозависимая функция. MsgBox это необязательно показ сообщения, в зависимости от условий это может быть и запись сообщения в журнал событий (ReportEvent).
1
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
04.11.2017, 00:30
Цитата Сообщение от Плотник Посмотреть сообщение
Гайд по созданию DLL на VB6.
Заработало по Вашему способу. Однако, только в 32х битном Excel на Windows XP.
При запуске на Windows 7 x64 и 32х битном Excel dll подгружается, функции определяются, но при вызове функций в коде Excel вылетает.

Полагаю, что дело в "битности".
Возможна ли адаптация Вашего способа под x64?
Существуют ли универсальные варианты х32-х64?

Заранее благодарю за любую помощь.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
04.11.2017, 11:31
Цитата Сообщение от Плотник Посмотреть сообщение
При запуске на Windows 7 x64 и 32х битном Excel dll подгружается, функции определяются, но при вызове функций в коде Excel вылетает.
Dll в студию.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
04.11.2017, 17:29
DLL, исходники, excel с формой вызова в приложении
Вложения
Тип файла: zip TESTDLL.ZIP (33.4 Кб, 73 просмотров)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
04.11.2017, 17:47
Цитата Сообщение от Плотник Посмотреть сообщение
DLL, исходники, excel с формой вызова в приложении
Поставь SP6 для VB6 и компилируй, либо перекомпилируй TLB и измени msvbvm60.dll на MSVBVM60.DLL - все заработает.
Миниатюры
Создание процедурных DLL в Visual Basic (статья)  
1
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
04.11.2017, 22:38
Всё получилось. Огромное спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2017, 22:38
Помогаю со студенческими работами здесь

Visual Basic + VC++ DLL = ошибка Bad DLL calling convertation
Попытался я написать DLL-ку на VC++, для последующего использования ее в VB. Но поскольку я в VC++ чайник - он мне выдает ошибку Bad DLL...

Использование библиотеки dll написанной в Visual Basic
Здравствуйте. Не получается использовать библиотеку написанную в VB. Вот так вызываю функцию библиотеки: Prototype.i...

Можно ли в Visual Basic использовать стандартные Windows DLL?
Добрый день! Подскажите пожалуйста, можно ли в Visual Basic использовать стандартные Windows DLL? Если можно, подскажите где взять...

Visual Basic 6 DLL для работы с php файлами
Есть ли такой? Если есть, дайте пож-та!

Visual Basic вылетает с ошибкой при попытке вызова функции из DLL
Declare Function testdll Lib &quot;cfg.dll&quot; () As String Private Sub Form_Load() Me.Caption = testdll() End Sub сама dll...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru