Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/68: Рейтинг темы: голосов - 68, средняя оценка - 4.59
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1

Создание DLL

23.07.2013, 16:20. Показов 14022. Ответов 103
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код программы (пример использования DLL):
Visual Basic
1
2
3
4
5
6
Option Explicit
Private Declare Function Symma Lib "Summ.dll" Alias "Summ" (ByVal a As Integer, ByVal b As Integer) As Integer
 
Private Sub Command1_Click()
Text3.Text = Symma(Val(Text1.Text), Val(Text2.Text))
End Sub
Код DLL (точнее ActiveX DLL):
Visual Basic
1
2
3
Private Function Summ(ByVal a As Integer, ByVal b As Integer) As Integer
Summ = a + b
End Function
В Project-References перечислены все ActiveX объекты на компьютере, там нужно добавить имя проекта DLL (например Project2).

Вот таким образом я всё сделал по инструкции из статей по работе с DLL, но не могу скомпилировать exe: пишет, что нужно скомпилировать сначала второй проект с DLL. Его компиляция (Make Summ.dll), а также (одновременная компиляция всей группы проектов) Make Project Group не дают результата - якобы он не скомпилирован, хотя это не так. Плюс при компиляции DLL выдает сообщение, что нельзя получить доступ к системному регистру (System Registry).
В чём может быть дело?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2013, 16:20
Ответы с готовыми решениями:

Создание ActiveX Dll в VB 6
Здравствуйте! У меня имеется .dll, .lib и .hpp файлы, библиотека используется управления контроллером. Хочу создать ActiveX враппер для...

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

Создание DLL в VB, в которой хранятся формы.
Подскажите какие-нибудь ресурсы где можно почитать о создании DLL в VB, в которой хранятся формы.

103
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 20:46
Студворк — интернет-сервис помощи студентам
То есть не загружается только при запуске в IDE?
Да.
Цитата Сообщение от locm Посмотреть сообщение
А если запустить в IDE с отключенным отладчиком? Может в нем проблема?
Что-то я Вас не понял. Какой отладчик в VB6?

Вот для примера, у кого есть VB6 можно посмотреть приложил проект.
Вложения
Тип файла: rar DllAsm.rar (21.1 Кб, 13 просмотров)
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
27.07.2013, 21:02
Цитата Сообщение от The trick Посмотреть сообщение
Какой отладчик в VB6?
Тот что в меню "Debug".

Запустил из IDE и все работает.
Миниатюры
Создание DLL  
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.07.2013, 22:06  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Используй WinAPI функции: LoadLibrary, GetProcAddress и FreeLibrary.
Вот такой получился большой код! Работал в соответствии со справкой об API, так как готового примера не нашёл. После 16 строки теоретически нужная функция должна быть доступна (кстати, есть что-нибудь наподобие alias здесь?), но проверить не могу - ошибка в 8 строке при загрузке библиотеки. В чём может быть дело?

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
43
Option Explicit
Dim handle, address, unload
Private Declare Function LoadLibrary Lib "kernel32" (ByVal lpFileName)
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule, ByVal lpProcName)
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hModule)
 
Private Sub Form_Load()
handle = LoadLibrary(Project2.dll)
If handle <> Null Then
 
   MessageBox ("Библиотека успешно загружена.")
   address = GetProcAddress(handle, Summ)  
 
   If address <> Null Then
 
      MessageBox ("Адрес функции успешно получен.")
  
   ElseIf address = Null Then
 
      MessageBox ("Îøèáêà ïðè èçâëå÷åíèè àäðåñà ôóíêöèè èç DLL!")
      Exit Sub
 
   End If
  
ElseIf handle = Null Then
 
   MessageBox ("Îøèáêà ïðè çàãðóçêå DLL!")
 
End If
 
unload = FreeLibrary(handle)
 
If unload <> 0 Then
 
   MessageBox ("Библиотека выгружена успешно.")
 
ElseIf unload = 0 Then
 
   MessageBox ("Ошибка при выгрузке библиотеки из памяти!")
 
End If
 
End Sub
Кстати, для того, чтобы загружать DLL динамически, мы сначала должны загрузить статически kernel32 (который будет у нас в памяти всё время), чтобы эти функции использовать. Так что получается, что можно в VB загрузить любую библиотеку динамически, кроме самого kernel32.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
27.07.2013, 22:11
Цитата Сообщение от Craw Посмотреть сообщение
ошибка в 8 строке при загрузке библиотеки
Строки должны быть в кавычках.
Цитата Сообщение от Craw Посмотреть сообщение
Так что получается, что можно в VB загрузить любую библиотеку динамически, кроме самого kernel32.
Не только kernel32. VB еще рантайм грузит, а тот в свою очередь, много чего еще загружает.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 22:15
Craw, Вы когда-нибудь слышали о типах переменных?
Кликните здесь для просмотра всего текста
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
43
44
45
Option Explicit
 
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
 
Dim handle As Long, address As Long, unload As Long
 
Private Sub Form_Load()
handle = LoadLibrary("Project2.dll")
If handle <> 0 Then
 
   MsgBox ("Библиотека успешно загружена.")
   address = GetProcAddress(handle, "Summ")
 
   If address <> 0 Then
 
      MsgBox ("Адрес функции успешно получен.")
  
   ElseIf address = 0 Then
 
      MsgBox ("Ошибка при извлечении адреса функции из DLL!")
      Exit Sub
 
   End If
  
ElseIf handle = 0 Then
 
   MsgBox ("Ошибка при загрузке DLL!")
 
End If
 
unload = FreeLibrary(handle)
 
If unload <> 0 Then
 
   MsgBox ("Библиотека выгружена успешно.")
 
ElseIf unload = 0 Then
 
   MsgBox ("Ошибка при выгрузке библиотеки из памяти!")
 
End If
 
End Sub
1
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.07.2013, 22:16  [ТС]
Ну откуда мне было знать, какие значения возвратят функции и какого типа у неё параметры! Вот в Delphi handle не числового типа, а особого THandle. Так что я здесь использовал Variant как универсальный.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
27.07.2013, 22:23
Цитата Сообщение от Craw Посмотреть сообщение
Вот в Delphi handle не числового типа, а особого THandle.
Эквивалентного типу Long (для x86).
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.07.2013, 01:21
Цитата Сообщение от Craw Посмотреть сообщение
Ну откуда мне было знать, какие значения возвратят функции и какого типа у неё параметры!
Вам поможет ApiTextViewer, а вообще варианты, так использовать нельзя, у них другой формат, просто-напросто можно обрушить прогу и IDE. Типы параметров можно также просмотреть в Windows.inc. Хендлы - как правило целочисленные переменные.

Добавлено через 2 часа 45 минут
Цитата Сообщение от locm Посмотреть сообщение
Запустил из IDE и все работает.
Я так и не добился успешной загрузки в IDE. LdrLoadDll почему-то возвращает STATUS_CONFLICTING_ADDRESSES; я так думаю это из-за того что в DLL написанной на PureBasic отсутствует секция .reloc GetLastError возвращает 0.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
28.07.2013, 09:45
Цитата Сообщение от Craw Посмотреть сообщение
Да в принципе на Делфи тоже не сложно DLL сделать.
- я только хотел сказать, что оставаться в рамках одного языка удобнее.

Добавлено через 1 минуту
Цитата Сообщение от Craw Посмотреть сообщение
ошибка в 8 строке при загрузке библиотеки. В чём может быть дело?
- мне кажется, кавычек не хватает.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
28.07.2013, 12:39
Цитата Сообщение от The trick Посмотреть сообщение
я так думаю это из-за того что в DLL написанной на PureBasic отсутствует секция .reloc
Она там есть, но для уменьшения размера файла, добавил пару опций линковки.
Code
1
2
3
4
5
6
/merge:.text=.code
/merge:.data=.code
/merge:.rsrc=.code
/merge:.rdata=.code
/merge:.reloc=.code
/align:16
Секция ".reloc" находится в секции ".code".
Это не мешает загрузке dll стандартным Windows-загрузчиком.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
28.07.2013, 12:55
DLL без слияния секций.
Вложения
Тип файла: zip Test_DLL.zip (541 байт, 12 просмотров)
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.07.2013, 14:44
Цитата Сообщение от locm Посмотреть сообщение
DLL без слияния секций.
Все равно не работает ldrLoadDll по-прежнему возвращает STATUS_CONFLICTING_ADDRESSES
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,017
Записей в блоге: 7
28.07.2013, 15:16
Установил выравнивание секций по умолчанию (из-за чего размер файла увеличился в несколько раз из-за ненужных нулевых байтов).
Вложения
Тип файла: zip Test_DLL.zip (659 байт, 10 просмотров)
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.07.2013, 15:37
Цитата Сообщение от locm Посмотреть сообщение
Установил выравнивание секций
Вот сейчас работает, хотя я компилировал в масме /ALIGN:16 и все работает.
Вот полностью все опции:
Assembler
1
LINK.EXE /FILEALIGN:4 /ALIGN:16  /SUBSYSTEM:WINDOWS /merge:.text=.code /merge:.data=.code /merge:.rsrc=.code /merge:.rdata=.code /merge:.reloc=.code /DLL
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
02.08.2013, 19:40  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

На основе этой темы и всей информации здесь я написал статью для своего сайта - Работа с DLL в Visual Basic. А теперь собираюсь опубликовать на этом форуме её тоже.
Перед этим спрошу - полностью ли раскрыта тема, что-то добавить ещё?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
02.08.2013, 20:04
По поводу ActiveX-Dll рекомендую заглянуть сюда и сюда... И было бы интересно объяснить, как создает процедурные Dll автор надстройки.
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
02.08.2013, 20:13
+ О соглашениях вызовов функций, хотя бы stdCall и cDecl.
В скомпилированном проекте можно статически вызывать cDecl функции, если указать в декларации с помощью ключевого слова cDecl
Для вызова в отладке придется писать либо ассемблерную вставку, либо DLL для конвертации вызова.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
02.08.2013, 20:15
Цитата Сообщение от The trick Посмотреть сообщение
stdCall и cDecl
- а толку? Что это дает VB-программистам?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
02.08.2013, 20:18
Цитата Сообщение от Catstail Посмотреть сообщение
- а толку? Что это дает VB-программистам?
Как что? Есть куча cDecl - библиотек, та же ntdll. В ней куча полезных сишных функций, но проблема в том что их обычным способом не вызовешь из VB
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
02.08.2013, 20:24
Цитата Сообщение от The trick Посмотреть сообщение
Есть куча cDecl - библиотек
- а, да. Согласен. Я просто больше имел в виду создание dll, а не использование готовых.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2013, 20:24

Создание процедурных DLL в Visual Basic (статья)
Создание процедурных DLL в Visual Basic Несколько слов о резонах создания процедурных Dll на VB. Как известно, VB позволяет без...

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

Ошибка Can't find DLL entry point CryptEnumProvidersA in advapi32.dll
Проблема вот в чем. Объявляем CryptEnumProviderTypesA Private Declare Function CryptEnumProviders Lib 'advapi32.dll' Alias...

ntdll.dll и kernel32.dll - Реальные примеры работы на vb6
Копался, копался по стороннему форуму и наткнулся на всевозможные вызовы апифункций из недокументированной дллки ntdll.dll. Учитывая то,...

За какую функцию отвечают user32.dll,kernel32,winmm.dll
Помогите мне пожалуйста,разобратся с этими DLLками. Если есть где можно скачать матерьял,буду премного благодарен.


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru