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

Visual Basic

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 129, средняя оценка - 4.62
Catstail
Модератор
22739 / 11108 / 1797
Регистрация: 12.02.2012
Сообщений: 18,307
#1

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

25.08.2013, 22:19. Просмотров 19670. Ответов 65
Метки нет (Все метки)

Создание процедурных 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 Кб, 232 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Есть ли такой? Если есть, дайте пож-та!

65
Антихакер32
Заблокирован
06.02.2014, 22:27 #31
Цитата Сообщение от The trick Посмотреть сообщение
InitCommonControlsEx
вы об этом ?
C++
1
#include "commctrl.h"
0
The trick
Модератор
7200 / 2432 / 741
Регистрация: 22.02.2013
Сообщений: 3,501
Записей в блоге: 74
06.02.2014, 22:32 #32
Цитата Сообщение от Pro_grammer Посмотреть сообщение
У меня тоже повисла. Я и с прототипами пытался и так. И строку передавал и указатель на строку.
Каким образом задекларирована функция? Скинь exe, я в отладчике гляну, только DLL пропиши в папке.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
The trick, так как с простой функцией? Если всё возможно и так просто, то сделай, тогда уж и посмотрим.
Ок, пару моментов
Цитата Сообщение от locm Посмотреть сообщение
Не работает.
Тоже скинь мне exe я его в отладчике гляну в чем проблема.
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
вы об этом ?
Нет, об этом
C++ (Qt)
1
2
3
4
tagINITCOMMONCONTROLSEX cc;
    cc.dwSize = sizeof(cc);
    cc.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx((LPINITCOMMONCONTROLSEX)&cc);
0
Антихакер32
Заблокирован
06.02.2014, 22:33 #33
The trick, Вам нужно было пример запуска на PB продемонстрировать
но вы наверное его не знаете )
0
locm
2027 / 784 / 75
Регистрация: 28.10.2011
Сообщений: 2,342
Записей в блоге: 2
06.02.2014, 22:38 #34
Цитата Сообщение от The trick Посмотреть сообщение
Каким образом задекларирована функция?
PureBasic
1
Prototype CreateVBWindow(HINSTANCE, LPSTR.s)
В архиве прога и исходник. Только учти что после запуска скомпилированой программы вроде ничего не происходит, но на самом деле, программа виснет в функции и нее нужно завершать через диспетчер задач.
0
Вложения
Тип файла: zip vb6Dl.zip (6.6 Кб, 17 просмотров)
locm
2027 / 784 / 75
Регистрация: 28.10.2011
Сообщений: 2,342
Записей в блоге: 2
06.02.2014, 22:38 #35
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Вам нужно было пример запуска на PB продемонстрировать
Зачем? И так понятно какой должен быть код.
0
The trick
Модератор
7200 / 2432 / 741
Регистрация: 22.02.2013
Сообщений: 3,501
Записей в блоге: 74
06.02.2014, 23:01 #36
Вот DLL которая импортирует функцию VBSum
Visual Basic
1
2
3
Public Function VBSum(ByVal A As Long, ByVal B As Long) As Long
    VBSum = A + B
End Function
Параметры надо передавать по значению 4 байтные целочисленные, соглашение вызова stdcall, возвращает сумму двух операндов. Эта функция просто не может не работать т.к. она состоит из 4 ассемблерных инструкций (кто сомневался в крутизне бейсика ).
Вот код вызова на C++
C++
1
2
3
4
5
6
7
8
9
10
11
    HMODULE hLib;
    int res;
    char msg[20];
 
    hLib = LoadLibrary("D:\\Program Files\\Microsoft Visual Studio\\VB98\\BitPirit\\CyberForum\\proof_project\\vbSum.dll");
    int (__stdcall *pFunction)(int,int);
    (FARPROC &)pFunction = GetProcAddress(hLib, "VBSum");
    res = pFunction(100,200); // ÂûçûâГ*Гѕ èìïîðòèðóåìóþ ГґГіГ*êöèþ ГЁГ§ DLL
    wsprintf(msg, "%i", res);
    MessageBox (NULL, msg, "ÐåçóëüòГ*ГІ", MB_OK);
    return 0;
1
Миниатюры
Создание процедурных DLL в Visual Basic (статья)  
Pro_grammer
Модератор
6019 / 2106 / 401
Регистрация: 24.04.2011
Сообщений: 3,603
Записей в блоге: 10
06.02.2014, 23:29 #37
Цитата Сообщение от The trick Посмотреть сообщение
Вот DLL которая импортирует функцию VBSum
Где она?
0
Антихакер32
Заблокирован
06.02.2014, 23:36 #38

Не по теме:

Наверняка она у него есть )



Добавлено через 2 минуты
я так думаю он скомпелировал только эти строчки на VB
Visual Basic
1
2
3
Public Function VBSum(ByVal A As Long, ByVal B As Long) As Long
    VBSum = A + B
End Function
0
locm
2027 / 784 / 75
Регистрация: 28.10.2011
Сообщений: 2,342
Записей в блоге: 2
06.02.2014, 23:39 #39
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
я так думаю он скомпелировал только эти строчки на VB
Раз вы так думаете, то скомпилируйте DLL и выложите сюда.
А то пока что больше флуда чем нормальных сообщений.
0
The trick
Модератор
7200 / 2432 / 741
Регистрация: 22.02.2013
Сообщений: 3,501
Записей в блоге: 74
06.02.2014, 23:44 #40
Смотрел код Iocm'а и увидел что там статично передаеться имя класса "TrickWindow" в CreateWindow, а Iocm передавал "Test", так что если вы вторым параметром передадите "TrickWindow", то у вас все запустится. Так что извиняюсь, невнимательно код просмотрел. Вот нормальная версия первой Dll и вторая Dll
1
Вложения
Тип файла: rar Dll.rar (6.6 Кб, 25 просмотров)
locm
2027 / 784 / 75
Регистрация: 28.10.2011
Сообщений: 2,342
Записей в блоге: 2
06.02.2014, 23:56 #41
DLL заработала. Теперь хотелось бы увидеть подробную инструкцию по созданию DLL в VB.
А чтобы она не потерялась, лучше ее разместить в этой теме. Создание процедурных DLL в Visual Basic (статья)
0
The trick
Модератор
7200 / 2432 / 741
Регистрация: 22.02.2013
Сообщений: 3,501
Записей в блоге: 74
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
Модератор
6019 / 2106 / 401
Регистрация: 24.04.2011
Сообщений: 3,603
Записей в блоге: 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
Модератор
6019 / 2106 / 401
Регистрация: 24.04.2011
Сообщений: 3,603
Записей в блоге: 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, 08:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 08:14
Привет! Вот еще темы с ответами:

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


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

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

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