Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/121: Рейтинг темы: голосов - 121, средняя оценка - 4.90
Catstail
Модератор
23742 / 11823 / 2069
Регистрация: 12.02.2012
Сообщений: 19,226
1

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

25.08.2013, 22:19. Просмотров 22022. Ответов 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 для использования наших функций.

Все, разложенные по директориям, исходники прилагаются:
13
Вложения
Тип файла: zip vb_dll_proc.zip (27.2 Кб, 258 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 22:19
Ответы с готовыми решениями:

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

создание dll на основе visual basic
Помогите решить рабочую задачу: создание dll на основе visual basic. Требуется...

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

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

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

74
Kataraksis
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 2
24.11.2015, 18:38 61
Спасибо за ответ! Как мне уже удалось установить, что на VB6 вообще нет возможности создания 64-битных dll и видимо придется осваивать и переделывать код под VB.Net
0
locm
2157 / 884 / 114
Регистрация: 28.10.2011
Сообщений: 2,810
Записей в блоге: 6
24.11.2015, 18:49 62
Цитата Сообщение от Kataraksis Посмотреть сообщение
видимо придется осваивать и переделывать код под VB.Net
Он тоже не создает процедурные dll. Существует не так много бейсиков которые подходят для создания процедурных x64 DLL. Например это FreeBasic и PureBasic (статья). Может еще какие-то.
2
Dragokas
Эксперт WindowsАвтор FAQ
17016 / 7073 / 856
Регистрация: 25.12.2011
Сообщений: 10,894
Записей в блоге: 16
19.06.2017, 19:53 63
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?

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

Мой пример падает.
0
Вложения
Тип файла: zip vb_dll_proc2.zip (3.4 Кб, 7 просмотров)
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
20.06.2017, 00:21 64
Цитата Сообщение от Dragokas Посмотреть сообщение
А допускается ли работа с экземплярами классов, созданных внутри процедурной DLL ?
Если поток и проект инициализирован то да. Нужно обратить внимание на время жизни объекта и обеспечить нахождение dll в памяти пока хоть один экземпляр класса находится в памяти. Это довольно-таки сложная задача, проще использовать стандартный механизм.
Цитата Сообщение от Dragokas Посмотреть сообщение
Если да, то как правильно сформировать прототип и вызов?
Обычно создают общий интерфейс для всех классов.
Цитата Сообщение от Dragokas Посмотреть сообщение
Мой пример падает.
Потому что никакой инициализации нет.
2
Замабувараев
326 / 335 / 91
Регистрация: 18.12.2014
Сообщений: 682
Записей в блоге: 1
30.07.2017, 14:01 65
Почему нигде не указано, что параметры экспортируемых функций и DllMain и нужно объявлять как ByVal?
0
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
30.07.2017, 14:12 66
Цитата Сообщение от Замабувараев Посмотреть сообщение
параметры экспортируемых функций
Не обязательно, в зависимости от задачи.
Цитата Сообщение от Замабувараев Посмотреть сообщение
DllMain и нужно объявлять как ByVal
Да, в статье ошибка, но это почти никак не скажется на работе приведенной Dll. Там также ошибка в типе возвращаемого значения DllMain.
Гайд по созданию DLL на VB6.
2
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 8
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
Ошибка во вложении.
Вопрос один - что не так?
0
Миниатюры
Создание процедурных DLL в Visual Basic (статья)  
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
02.11.2017, 09:50 68
Цитата Сообщение от Плотник Посмотреть сообщение
Вопрос один - что не так?
Это пробовал?
Цитата Сообщение от The trick Посмотреть сообщение
1
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 8
02.11.2017, 10:38 69
Цитата Сообщение от The trick Посмотреть сообщение
Это пробовал?
Сообщение от The trick
Гайд по созданию DLL на VB6.
Нет. Спасибо. Попробую.

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

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

Заранее благодарю за любую помощь.
0
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
04.11.2017, 11:31 72
Цитата Сообщение от Плотник Посмотреть сообщение
При запуске на Windows 7 x64 и 32х битном Excel dll подгружается, функции определяются, но при вызове функций в коде Excel вылетает.
Dll в студию.
0
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 8
04.11.2017, 17:29 73
DLL, исходники, excel с формой вызова в приложении
0
Вложения
Тип файла: zip TESTDLL.ZIP (33.4 Кб, 8 просмотров)
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
04.11.2017, 17:47 74
Цитата Сообщение от Плотник Посмотреть сообщение
DLL, исходники, excel с формой вызова в приложении
Поставь SP6 для VB6 и компилируй, либо перекомпилируй TLB и измени msvbvm60.dll на MSVBVM60.DLL - все заработает.
1
Миниатюры
Создание процедурных DLL в Visual Basic (статья)  
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 8
04.11.2017, 22:38 75
Всё получилось. Огромное спасибо за помощь!
0
04.11.2017, 22:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2017, 22:38

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

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

Создание игры на Visual Basic-е
Можно ли с помощью Visual Basic создать игру вроде русской рыбалки 3 (или 2) И...


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

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru