Форум программистов, компьютерный форум, киберфорум
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. Показов 45074. Ответов 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
5876 / 2592 / 282
Регистрация: 28.10.2011
Сообщений: 9,833
Записей в блоге: 6
06.02.2014, 23:56 41
Author24 — интернет-сервис помощи студентам
DLL заработала. Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
А чтобы она не потерялась, лучше ее разместить в этой теме. Создание процедурных DLL в Visual Basic (статья)
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
07.02.2014, 00:20 42
Цитата Сообщение от locm Посмотреть сообщение
Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
Я писал уже несколькими постами ранее почему падают DLL написанные на VB6 в других ЯП. И давал ссылки (ссылки удалили, но они очень просто гуглятся), где объясняется как сделать так чтобы работало.
1
Заблокирован
07.02.2014, 07:11 43
Цитата Сообщение от The trick Посмотреть сообщение
(ссылки удалили, но они очень просто гуглятся)
тема очень интересная, Создание процедурных DLL в Visual Basic (статья)
жаль в этой статье об этом не говорилось, хорошо что у меня гугл есть )
0
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 08:13 44
В ходе рабочих дебатов в ветке для начинающих был всё же достигнут положительный результат. Вернее этот метод уже давно используется, и в большей степени положительно, а точнее с 2007 г.
Описан и разработан кем то под ником Хакер. В виду запрета ссылок на оригинальную статью - она на другом форуме, привожу только полное название :
[FireNativeDLL] Создание полноценных DLL на Visual Basic
Кто хочет, тот найдет.
Там проект создания DLL с одной функцией сложения целых чисел + FireNativeDLL 1.0 - это средство, которое добавит в VB возможность создавать обычные DLL + программа проверки работы DLL, написанная на PureBasic, Всё проверял на winXP, а посему в других современных ОС возможны траблы, прошу протестить.
P.S.
После установки FireNativeDLL 1.0 ни чего не сломается - как и раньше можно работать с обычными проектами.
2
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 08:14 45
Цитата Сообщение от 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
Заблокирован
07.02.2014, 09:08 46
я в той теме вас поблагодарил, а вот интересно The trick этими костылями пользовался ?
у него кстате win-семёрка
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
07.02.2014, 11:12 47
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Уважаемый The trick видимо не хочет тут описывать процесс создания DLL потому, что всё не так просто, и без костылей этот процесс не обходится.
Все очень просто, просто надо немного знать как работает VB6, в моих примерах никакой инициализации рантайма не было (она там и не нужна была), но это не мешало мне создать окно и контролы на нем. Как раз в плане общего пользования такая длл более чем достаточна (она поддерживает многопоточность, в ней можно вызывать любые API и многое другое), я написал кучу программ где не используется потокозависимые функции рантайма. Ты просил нормально работающую DLL, я ее сделал и выложил тебе (даже 2 штуки), ты убедился что они работают, даже спасибо не сказал. Тогда с чего мне доказывать кому-то что-то, что я знаю на 100% что это работает? Я бы мог просто написать - на VB6 можно делать полноценные DLL и все, и не тратить свое время, т.к. у меня его и так мало. Уж если на VB можно делать внедрение, самомодифицирующийся код, перехватывать АПИ, почему он не может создавать DLL?
2
6807 / 2837 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.02.2014, 13:09 48
Цитата Сообщение от The trick Посмотреть сообщение
я ее сделал и выложил тебе (даже 2 штуки)
Спасибо, конечно. Но что стОят 2 штуки ( да хоть 5 штук) готовых DLL без описания того, как их сделать?
Я так и не понял, каким образом сделаны твои DLL? Но точно не так, каким сделана моя. У меня в DLL только 1 функция - VBSum. А в твоих образцах есть куча дополнительных
DllCanUnloadNow()
DllGetClassObject()
DllRegisterServer()
DllUnregisterServer()
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
07.02.2014, 13:30 49
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А в твоих образцах есть куча дополнительных
Я эти DLL делал из ActiveX Dll, поэтому в ней содержатся эти функции (ее можно подключить через референсы), но мне ни чего не стоит сделать это любым другим способом (подменой линкера, FNDLL и т.п.), и у меня этих функций не будет, и будет также все работать, т.к. я писал что нет разницы каким способом создана DLL. Изначально вопрос не стоял в ограничении на экспортируемые функции, а всего лишь ты попросил работающую DLL
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я так и не понял, каким образом сделаны твои DLL?
Я делал пропиской ключей линкера LinkSwitches экспортируемых функций.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
Это функции нужны для работы COM
1
Заблокирован
11.02.2014, 05:53 50
И всётаки...., товарищи, покажите пример

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

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

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

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

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

Добавлено через 26 минут
а шаблон Standard DLL.vbp я не сразу у себя обнаружил, после установки
пришлось вскрыть архив SFX чтоб подсмотреть что туда установилось )
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
11.10.2014, 23:18 53
Многопоточность в VB6 часть 2 - создание Native DLL и вызов экспортируемой функции в другом потоке.
2
Заблокирован
12.10.2014, 01:07 54
Я редко заглядываю на сайт *Конференция 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 Кб, 70 просмотров)
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
12.10.2014, 01:11 55
Антихакер32, ты читал тему? Это уже было.
0
Заблокирован
12.10.2014, 01:18 56
Цитата Сообщение от The trick Посмотреть сообщение
ты читал тему? Это уже было.
Где?..
Может-быть и было, повторение мать учения, тем-более я так красиво оформил пост
что любой начинающий смогёт собрать *полноценную* длл-ку ))
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
12.10.2014, 15:08 57
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Где?..
Вообще-то я 2 раза описал это метод.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
что любой начинающий смогёт собрать *полноценную* длл-ку ))
Это ты хотел кавычки поставить вместо звездочек, тогда правильно. Эти DLL далеко неполноценные, нужно читать сначала информацию, которую копируешь сюда.

Добавлено через 13 часов 47 минут
Многопоточность в VB6 часть 3 - внедрение в чужой процесс.
Пример DLL, написанной на VB6, с внедрением ею в чужие процессы.
2
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
17.02.2015, 01:08 58
Многопоточность на VB6 часть 4 - многопоточность в Standart EXE.
Многопоточность в стандартном EXE.
3
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 2
24.11.2015, 08:56 59
Всем доброго времени суток! Позвольте задать небольшой вопрос? Пример dll из шапки отлично работает в проверочном модуле, запущенном в VB6, также справляется в VBA6.5 в Excel и в VBA7.1(x32) в AutoCAD, но в VBA7.1(x64) в AutoCAD выдает ошибку 48. Возможно это связано с необходимостью вызывать функции в виде: Private Declare PtrSafe Function? И можно ли как-то исправить сей момент? Заранее спасибо!
0
Модератор
9895 / 3800 / 878
Регистрация: 22.02.2013
Сообщений: 5,665
Записей в блоге: 78
24.11.2015, 13:41 60
Нельзя использовать 32-разрядные dll в 64 разрядных приложениях (можно обойти, но это дорого будет стоить)
2
24.11.2015, 13:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2015, 13:41
Помогаю со студенческими работами здесь

Использование библиотеки 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 написать программу вычисления значений функции двух переменных....


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

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