Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Catstail
Модератор
23531 / 11641 / 2034
Регистрация: 12.02.2012
Сообщений: 18,981
#1

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

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

Работа с 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 использовать...

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

74
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,670
Записей в блоге: 6
06.02.2014, 23:56 #41
DLL заработала. Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
А чтобы она не потерялась, лучше ее разместить в этой теме. http://www.cyberforum.ru/visual-basic/thread943581-page2.html
0
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
07.02.2014, 00:20 #42
Цитата Сообщение от locm Посмотреть сообщение
Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
Я писал уже несколькими постами ранее почему падают DLL написанные на VB6 в других ЯП. И давал ссылки (ссылки удалили, но они очень просто гуглятся), где объясняется как сделать так чтобы работало.
1
Антихакер32
Заблокирован
07.02.2014, 07:11 #43
Цитата Сообщение от The trick Посмотреть сообщение
(ссылки удалили, но они очень просто гуглятся)
тема очень интересная, Создание процедурных DLL в Visual Basic (статья)
жаль в этой статье об этом не говорилось, хорошо что у меня гугл есть )
0
Pro_grammer
Модератор
6135 / 2213 / 437
Регистрация: 24.04.2011
Сообщений: 3,872
Записей в блоге: 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
Pro_grammer
Модератор
6135 / 2213 / 437
Регистрация: 24.04.2011
Сообщений: 3,872
Записей в блоге: 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 минут
Всё получилось, проект и все необходимые для этого файлы тут
http://www.cyberforum.ru/visual-basi...ml#post5750181
0
Антихакер32
Заблокирован
07.02.2014, 09:08 #46
я в той теме вас поблагодарил, а вот интересно The trick этими костылями пользовался ?
у него кстате win-семёрка
0
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
07.02.2014, 11:12 #47
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Уважаемый The trick видимо не хочет тут описывать процесс создания DLL потому, что всё не так просто, и без костылей этот процесс не обходится.
Все очень просто, просто надо немного знать как работает VB6, в моих примерах никакой инициализации рантайма не было (она там и не нужна была), но это не мешало мне создать окно и контролы на нем. Как раз в плане общего пользования такая длл более чем достаточна (она поддерживает многопоточность, в ней можно вызывать любые API и многое другое), я написал кучу программ где не используется потокозависимые функции рантайма. Ты просил нормально работающую DLL, я ее сделал и выложил тебе (даже 2 штуки), ты убедился что они работают, даже спасибо не сказал. Тогда с чего мне доказывать кому-то что-то, что я знаю на 100% что это работает? Я бы мог просто написать - на VB6 можно делать полноценные DLL и все, и не тратить свое время, т.к. у меня его и так мало. Уж если на VB можно делать внедрение, самомодифицирующийся код, перехватывать АПИ, почему он не может создавать DLL?
2
Pro_grammer
Модератор
6135 / 2213 / 437
Регистрация: 24.04.2011
Сообщений: 3,872
Записей в блоге: 10
07.02.2014, 13:09 #48
Цитата Сообщение от The trick Посмотреть сообщение
я ее сделал и выложил тебе (даже 2 штуки)
Спасибо, конечно. Но что стОят 2 штуки ( да хоть 5 штук) готовых DLL без описания того, как их сделать?
Я так и не понял, каким образом сделаны твои DLL? Но точно не так, каким сделана моя. У меня в DLL только 1 функция - VBSum. А в твоих образцах есть куча дополнительных
DllCanUnloadNow()
DllGetClassObject()
DllRegisterServer()
DllUnregisterServer()
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
0
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
07.02.2014, 13:30 #49
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А в твоих образцах есть куча дополнительных
Я эти DLL делал из ActiveX Dll, поэтому в ней содержатся эти функции (ее можно подключить через референсы), но мне ни чего не стоит сделать это любым другим способом (подменой линкера, FNDLL и т.п.), и у меня этих функций не будет, и будет также все работать, т.к. я писал что нет разницы каким способом создана DLL. Изначально вопрос не стоял в ограничении на экспортируемые функции, а всего лишь ты попросил работающую DLL
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я так и не понял, каким образом сделаны твои DLL?
Я делал пропиской ключей линкера LinkSwitches экспортируемых функций.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Нужны ли они? При чем в одном случае они без параметров, в другом случае с 2-мя параметрами.
Хотелось бы ясности в этом вопросе!
Это функции нужны для работы COM
1
Антихакер32
Заблокирован
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
Pro_grammer
Модератор
6135 / 2213 / 437
Регистрация: 24.04.2011
Сообщений: 3,872
Записей в блоге: 10
11.02.2014, 07:48 #51
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а главное, хотелось бы отправить клиенту посылку со своим приложением
у которого есть рантайм msvbvm60.dll
Прочитай самый первый пост этой темы. Если надо работать с DLL только из VB6, то проблем нет вообще. Там и пример есть.

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

Добавлено через 26 минут
а шаблон Standard DLL.vbp я не сразу у себя обнаружил, после установки
пришлось вскрыть архив SFX чтоб подсмотреть что туда установилось )
0
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
11.10.2014, 23:18 #53
Многопоточность в VB6 часть 2 - создание Native DLL и вызов экспортируемой функции в другом потоке.
2
Антихакер32
Заблокирован
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


Картинка:
0
Вложения
Тип файла: rar Мануал.rar (10.5 Кб, 22 просмотров)
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
12.10.2014, 01:11 #55
Антихакер32, ты читал тему? Это уже было.
0
Антихакер32
Заблокирован
12.10.2014, 01:18 #56
Цитата Сообщение от The trick Посмотреть сообщение
ты читал тему? Это уже было.
Где?..
Может-быть и было, повторение мать учения, тем-более я так красиво оформил пост
что любой начинающий смогёт собрать *полноценную* длл-ку ))
0
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
12.10.2014, 15:08 #57
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Где?..
Вообще-то я 2 раза описал это метод.
Цитата Сообщение от Антихакер32 Посмотреть сообщение
что любой начинающий смогёт собрать *полноценную* длл-ку ))
Это ты хотел кавычки поставить вместо звездочек, тогда правильно. Эти DLL далеко неполноценные, нужно читать сначала информацию, которую копируешь сюда.

Добавлено через 13 часов 47 минут
Многопоточность в VB6 часть 3 - внедрение в чужой процесс.
Пример DLL, написанной на VB6, с внедрением ею в чужие процессы.
2
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
17.02.2015, 01:08 #58
Многопоточность на VB6 часть 4 - многопоточность в Standart EXE.
Многопоточность в стандартном EXE.
3
Kataraksis
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
The trick
Модератор
7342 / 2563 / 752
Регистрация: 22.02.2013
Сообщений: 3,782
Записей в блоге: 76
24.11.2015, 13:41 #60
Нельзя использовать 32-разрядные dll в 64 разрядных приложениях (можно обойти, но это дорого будет стоить)
1
24.11.2015, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2015, 13:41
Привет! Вот еще темы с решениями:

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

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

создание массива Visual Basic
Найти сумму и число тех элементов заданного вектора X1, X2, ..., Xn, которые...

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


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

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

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