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

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

25.08.2013, 22:19. Показов 47637. Ответов 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
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,279
Записей в блоге: 7
06.02.2014, 23:56
Студворк — интернет-сервис помощи студентам
DLL заработала. Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
А чтобы она не потерялась, лучше ее разместить в этой теме. Создание процедурных DLL в Visual Basic (статья)
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
07.02.2014, 00:20
Цитата Сообщение от locm Посмотреть сообщение
Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
Я писал уже несколькими постами ранее почему падают DLL написанные на VB6 в других ЯП. И давал ссылки (ссылки удалили, но они очень просто гуглятся), где объясняется как сделать так чтобы работало.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
07.02.2014, 07:11
Цитата Сообщение от The trick Посмотреть сообщение
(ссылки удалили, но они очень просто гуглятся)
тема очень интересная, Создание процедурных DLL в Visual Basic (статья)
жаль в этой статье об этом не говорилось, хорошо что у меня гугл есть )
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 08:13
В ходе рабочих дебатов в ветке для начинающих был всё же достигнут положительный результат. Вернее этот метод уже давно используется, и в большей степени положительно, а точнее с 2007 г.
Описан и разработан кем то под ником Хакер. В виду запрета ссылок на оригинальную статью - она на другом форуме, привожу только полное название :
[FireNativeDLL] Создание полноценных DLL на Visual Basic
Кто хочет, тот найдет.
Там проект создания DLL с одной функцией сложения целых чисел + FireNativeDLL 1.0 - это средство, которое добавит в VB возможность создавать обычные DLL + программа проверки работы DLL, написанная на PureBasic, Всё проверял на winXP, а посему в других современных ОС возможны траблы, прошу протестить.
P.S.
После установки FireNativeDLL 1.0 ни чего не сломается - как и раньше можно работать с обычными проектами.
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 08:14
Цитата Сообщение от locm Посмотреть сообщение
Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
Цитата Сообщение от The trick Посмотреть сообщение
И давал ссылки (ссылки удалили, но они очень просто гуглятся), где объясняется как сделать так чтобы работало.
Уважаемый The trick видимо не хочет тут описывать процесс создания DLL потому, что всё не так просто, и без костылей этот процесс не обходится.

Во одной предлагается открыть vbp-файл блокнотом и добавить туда ключи экспорта наших функций. Этот способ был бы идеальным, но как там же и оговаривается никакой «инициализации рантайма» нет, а значит такая Dll бесполезна в плане общего применения.

В другой ссылке предлагается скачать FireNativeDLL 1.0 - это средство, которое добавит в VB возможность создавать обычные DLL (т.н. в народе NativeDLL).
Но тоже не всё гладко в плане работы. У кого с 7-кой не работает, у кого работает, но 1 раз и т.п. мелочи.
Вроде бы да, на Vb6 можно как то написать DLL, но гарантий правильной работы ни кто не даст.

Добавлено через 55 минут
Всё получилось, проект и все необходимые для этого файлы тут
Создание процедурных DLL в Visual Basic (статья)
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
07.02.2014, 09:08
я в той теме вас поблагодарил, а вот интересно The trick этими костылями пользовался ?
у него кстате win-семёрка
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
07.02.2014, 11:12
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Уважаемый The trick видимо не хочет тут описывать процесс создания DLL потому, что всё не так просто, и без костылей этот процесс не обходится.
Все очень просто, просто надо немного знать как работает VB6, в моих примерах никакой инициализации рантайма не было (она там и не нужна была), но это не мешало мне создать окно и контролы на нем. Как раз в плане общего пользования такая длл более чем достаточна (она поддерживает многопоточность, в ней можно вызывать любые API и многое другое), я написал кучу программ где не используется потокозависимые функции рантайма. Ты просил нормально работающую DLL, я ее сделал и выложил тебе (даже 2 штуки), ты убедился что они работают, даже спасибо не сказал. Тогда с чего мне доказывать кому-то что-то, что я знаю на 100% что это работает? Я бы мог просто написать - на VB6 можно делать полноценные DLL и все, и не тратить свое время, т.к. у меня его и так мало. Уж если на VB можно делать внедрение, самомодифицирующийся код, перехватывать АПИ, почему он не может создавать DLL?
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 13:09
Цитата Сообщение от The trick Посмотреть сообщение
я ее сделал и выложил тебе (даже 2 штуки)
Спасибо, конечно. Но что стОят 2 штуки ( да хоть 5 штук) готовых DLL без описания того, как их сделать?
Я так и не понял, каким образом сделаны твои DLL? Но точно не так, каким сделана моя. У меня в DLL только 1 функция - VBSum. А в твоих образцах есть куча дополнительных
DllCanUnloadNow()
DllGetClassObject()
DllRegisterServer()
DllUnregisterServer()
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
07.02.2014, 13:30
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А в твоих образцах есть куча дополнительных
Я эти DLL делал из ActiveX Dll, поэтому в ней содержатся эти функции (ее можно подключить через референсы), но мне ни чего не стоит сделать это любым другим способом (подменой линкера, FNDLL и т.п.), и у меня этих функций не будет, и будет также все работать, т.к. я писал что нет разницы каким способом создана DLL. Изначально вопрос не стоял в ограничении на экспортируемые функции, а всего лишь ты попросил работающую DLL
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я так и не понял, каким образом сделаны твои DLL?
Я делал пропиской ключей линкера LinkSwitches экспортируемых функций.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
Это функции нужны для работы COM
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
11.02.2014, 05:53
И всётаки...., товарищи, покажите пример

1) отдельный проект где созданно 1 или 2 функции, подготовленный для компиляции в DLL + коментарии на русском
2) другой проект написанный на VB6 (VBA) который использует эту(эти) функции + коментарии на русском

Цитата Сообщение от The trick Посмотреть сообщение
Я делал пропиской ключей линкера LinkSwitches экспортируемых функций.
Цитата Сообщение от The trick Посмотреть сообщение
но мне ни чего не стоит сделать это любым другим способом (подменой линкера, FNDLL и т.п.), и у меня этих функций не будет, и будет также все работать
Как это правильно сделать?
Расскажите в этой теме. Хотя-бы мне
обычному землянину, имеющего среднее образование
и знающего только синтаксис VB6(VBA)
я очень хочу это понять

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

Добавлено через 11 минут
а главное, хотелось бы отправить клиенту посылку со своим приложением
у которого есть рантайм msvbvm60.dll
посылку, где будет папка с DLL-ками и EXE-Файл , который будет сразу-же работать
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.02.2014, 07:48
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а главное, хотелось бы отправить клиенту посылку со своим приложением
у которого есть рантайм msvbvm60.dll
Прочитай самый первый пост этой темы. Если надо работать с DLL только из VB6, то проблем нет вообще. Там и пример есть.

Все копии ломают исключительно из желания работать с DLL написанными в VB6 на других ЯП.
Повторюсь, что ввиду запрета ссылок на оригинальную статью - она на другом форуме, привожу только полное название :
[FireNativeDLL] Создание полноценных DLL на Visual Basic ( первая строка Гугла)
Там есть инсталлятор на 3-й странице конференции ( нужна регистрация). После установки появится шаблон в VB6, куда надо вписать свои функции, скомпилировать обычный способом и наслаждаться полученной DLL.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
11.02.2014, 08:39
Ну хорошо, спасибо, Native VB DLL.zip вы сдесь уже выкладывали ...
сейчас к себе копирую, все страницы, из найденной дополнительной информации
буду разбираться ...

Добавлено через 26 минут
а шаблон Standard DLL.vbp я не сразу у себя обнаружил, после установки
пришлось вскрыть архив SFX чтоб подсмотреть что туда установилось )
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
11.10.2014, 23:18
Многопоточность в VB6 часть 2 - создание Native DLL и вызов экспортируемой функции в другом потоке.
2
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
12.10.2014, 01:07
Я редко заглядываю на сайт *Конференция VBStreets*
Зато теперь понятно как сделать нативную DLL (без примочек)

Откройте блокнотом проектный файл (vbp)
и обратите внимание на новый ключ внизу ([VBCompiler]),
и как экспортируются функции из DLL


Кликните здесь для просмотра всего текста
Type=OleDll
Module=Module1; Module1.bas
Class=Class1; Class1.cls
Startup="(None)"
HelpFile=""
ExeName32="1.dll"
Command32=""
Name="Vb1"
HelpContextID="0"
CompatibleMode="1"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=1
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[VBCompiler]
LinkSwitches=-export:Foo -export:Bar -export:VBStreetsRules


Картинка:
Вложения
Тип файла: rar Мануал.rar (10.5 Кб, 85 просмотров)
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
12.10.2014, 01:11
Антихакер32, ты читал тему? Это уже было.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
12.10.2014, 01:18
Цитата Сообщение от The trick Посмотреть сообщение
ты читал тему? Это уже было.
Где?..
Может-быть и было, повторение мать учения, тем-более я так красиво оформил пост
что любой начинающий смогёт собрать *полноценную* длл-ку ))
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
12.10.2014, 15:08
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Где?..
Вообще-то я 2 раза описал это метод.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
что любой начинающий смогёт собрать *полноценную* длл-ку ))
Это ты хотел кавычки поставить вместо звездочек, тогда правильно. Эти DLL далеко неполноценные, нужно читать сначала информацию, которую копируешь сюда.

Добавлено через 13 часов 47 минут
Многопоточность в VB6 часть 3 - внедрение в чужой процесс.
Пример DLL, написанной на VB6, с внедрением ею в чужие процессы.
2
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
17.02.2015, 01:08
Многопоточность на VB6 часть 4 - многопоточность в Standart EXE.
Многопоточность в стандартном EXE.
3
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 2
24.11.2015, 08:56
Всем доброго времени суток! Позвольте задать небольшой вопрос? Пример dll из шапки отлично работает в проверочном модуле, запущенном в VB6, также справляется в VBA6.5 в Excel и в VBA7.1(x32) в AutoCAD, но в VBA7.1(x64) в AutoCAD выдает ошибку 48. Возможно это связано с необходимостью вызывать функции в виде: Private Declare PtrSafe Function? И можно ли как-то исправить сей момент? Заранее спасибо!
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
24.11.2015, 13:41
Нельзя использовать 32-разрядные dll в 64 разрядных приложениях (можно обойти, но это дорого будет стоить)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2015, 13:41
Помогаю со студенческими работами здесь

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...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru