Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Catstail
Модератор
22841 / 11207 / 1813
Регистрация: 12.02.2012
Сообщений: 18,446
#1

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

25.08.2013, 22:19. Просмотров 20071. Ответов 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 Кб, 233 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание процедурных DLL в Visual Basic (статья) (VB):

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

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

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

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

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

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

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

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

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

Я, признаться, полагал, что и первоначальном примере при экспорте кода в Excel всё должно было работать - ведь вызывал-то MsgBox, не более.
0
The trick
Модератор
7222 / 2454 / 743
Регистрация: 22.02.2013
Сообщений: 3,522
Записей в блоге: 74
02.11.2017, 10:49 #70
Цитата Сообщение от Плотник Посмотреть сообщение
Я, признаться, полагал, что и первоначальном примере при экспорте кода в Excel всё должно было работать - ведь вызывал-то MsgBox, не более.
Нет. MsgBox потокозависимая функция. MsgBox это необязательно показ сообщения, в зависимости от условий это может быть и запись сообщения в журнал событий (ReportEvent).
1
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 5
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
Модератор
7222 / 2454 / 743
Регистрация: 22.02.2013
Сообщений: 3,522
Записей в блоге: 74
04.11.2017, 11:31 #72
Цитата Сообщение от Плотник Посмотреть сообщение
При запуске на Windows 7 x64 и 32х битном Excel dll подгружается, функции определяются, но при вызове функций в коде Excel вылетает.
Dll в студию.
0
Плотник
0 / 0 / 0
Регистрация: 31.10.2017
Сообщений: 5
04.11.2017, 17:29 #73
DLL, исходники, excel с формой вызова в приложении
0
Вложения
Тип файла: zip TESTDLL.ZIP (33.4 Кб, 2 просмотров)
The trick
Модератор
7222 / 2454 / 743
Регистрация: 22.02.2013
Сообщений: 3,522
Записей в блоге: 74
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
Сообщений: 5
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 вылетает с ошибкой при попытке вызова функции из DLL - Visual Basic
Declare Function testdll Lib &quot;cfg.dll&quot; () As String Private Sub Form_Load() Me.Caption = testdll() End Sub сама dll...

Создание матрицы в Visual Basic - Visual Basic
Дано две целочисленные матрицы размером . Найти сумму матриц. Умножить полученную матрицу на значение у: Определить: количество...

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

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ? - Visual Basic
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net


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

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

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