Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/225: Рейтинг темы: голосов - 225, средняя оценка - 4.73
Модератор
Эксперт функциональных языков программированияЭксперт Python
37303 / 20737 / 4272
Регистрация: 12.02.2012
Сообщений: 34,131
Записей в блоге: 14
1

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

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

Author24 — интернет-сервис помощи студентам
Создание процедурных 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 Кб, 431 просмотров)
14
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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. Тема:...

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

74
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 2
24.11.2015, 18:38 61
Author24 — интернет-сервис помощи студентам
Спасибо за ответ! Как мне уже удалось установить, что на VB6 вообще нет возможности создания 64-битных dll и видимо придется осваивать и переделывать код под VB.Net
0
5876 / 2592 / 282
Регистрация: 28.10.2011
Сообщений: 9,833
Записей в блоге: 6
24.11.2015, 18:49 62
Цитата Сообщение от Kataraksis Посмотреть сообщение
видимо придется осваивать и переделывать код под VB.Net
Он тоже не создает процедурные dll. Существует не так много бейсиков которые подходят для создания процедурных x64 DLL. Например это FreeBasic и PureBasic (статья). Может еще какие-то.
3
Эксперт WindowsАвтор FAQ
18010 / 7711 / 892
Регистрация: 25.12.2011
Сообщений: 11,483
Записей в блоге: 16
19.06.2017, 19:53 63
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?

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

Мой пример падает.
Вложения
Тип файла: zip vb_dll_proc2.zip (3.4 Кб, 47 просмотров)
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
20.06.2017, 00:21 64
Цитата Сообщение от Dragokas Посмотреть сообщение
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?
Если поток и проект инициализирован то да. Нужно обратить внимание на время жизни объекта и обеспечить нахождение dll в памяти пока хоть один экземпляр класса находится в памяти. Это довольно-таки сложная задача, проще использовать стандартный механизм.
Цитата Сообщение от Dragokas Посмотреть сообщение
Если да, то как правильно сформировать прототип и вызов?
Обычно создают общий интерфейс для всех классов.
Цитата Сообщение от Dragokas Посмотреть сообщение
Мой пример падает.
Потому что никакой инициализации нет.
3
COM‐пропагандист
933 / 782 / 149
Регистрация: 18.12.2014
Сообщений: 2,243
Записей в блоге: 4
30.07.2017, 14:01 65
Почему нигде не указано, что параметры экспортируемых функций и DllMain и нужно объявлять как ByVal?
1
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
30.07.2017, 14:12 66
Цитата Сообщение от Замабувараев Посмотреть сообщение
параметры экспортируемых функций
Не обязательно, в зависимости от задачи.
Цитата Сообщение от Замабувараев Посмотреть сообщение
DllMain и нужно объявлять как ByVal
Да, в статье ошибка, но это почти никак не скажется на работе приведенной Dll. Там также ошибка в типе возвращаемого значения DllMain.
Гайд по созданию DLL на VB6.
2
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
02.11.2017, 09:45 67
Добрый день.
Заранее прошу прощения, если спрашиваю в неправильной ветке, но ответа на форму не нашёл.
Попробовал Ваш способ создания 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
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
02.11.2017, 09:50 68
Цитата Сообщение от Плотник Посмотреть сообщение
Вопрос один - что не так?
Это пробовал?
Цитата Сообщение от The trick Посмотреть сообщение
1
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
02.11.2017, 10:38 69
Цитата Сообщение от The trick Посмотреть сообщение
Это пробовал?
Сообщение от The trick
Гайд по созданию DLL на VB6.
Нет. Спасибо. Попробую.

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

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

Заранее благодарю за любую помощь.
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
04.11.2017, 11:31 72
Цитата Сообщение от Плотник Посмотреть сообщение
При запуске на Windows 7 x64 и 32х битном Excel dll подгружается, функции определяются, но при вызове функций в коде Excel вылетает.
Dll в студию.
0
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 12
04.11.2017, 17:29 73
DLL, исходники, excel с формой вызова в приложении
Вложения
Тип файла: zip TESTDLL.ZIP (33.4 Кб, 56 просмотров)
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
04.11.2017, 17:47 74
Цитата Сообщение от Плотник Посмотреть сообщение
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 75
Всё получилось. Огромное спасибо за помощь!
0
04.11.2017, 22:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2017, 22:38
Помогаю со студенческими работами здесь

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

Можно ли в 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 =...

проблема с использованием функции в проекте Visual Basic, вызываемой из DLL написаной на Delphi5
Привет! У меня возникла проблема с использованием функции в проекте Visual Basic, вызываемой из...

Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Помогите пожалуйста! В среде VB написать программу вычисления значений функции двух переменных....


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

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru