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

Создание DLL

23.07.2013, 16:20. Показов 14032. Ответов 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
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
25.07.2013, 14:36
Студворк — интернет-сервис помощи студентам
В PowerBasic я оптимизацию не трогал. Просто взял - и скомпилировал. Не настаиваю, что PowerBasic порождает самый лаконичный код. А Ваш пример на каком Бэйсике?

Добавлено через 7 минут
А, увидел... Но тогда почему кто-то писал, что у PureBasic есть проблема в этом вопросе?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
25.07.2013, 15:19
Цитата Сообщение от Catstail Посмотреть сообщение
что у PureBasic есть проблема в этом вопросе?
Как раз наоборот. Проблема у VB6 в этом вопросе - та dll, которая была создана с помощью кода от SCINER больше ни где не работает, кроме как на самом VB6.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38209 / 21142 / 4312
Регистрация: 12.02.2012
Сообщений: 34,755
Записей в блоге: 14
25.07.2013, 16:48
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как раз наоборот. Проблема у VB6
- каюсь... Не разобрался.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.07.2013, 16:41  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
И что, на Delphi или C++ проще?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
library Project2; // название библиотеки
 
uses // используемые модули
  SysUtils,
  Classes;
 
{$R *.res} // команда подключить файл ресурсов
 
function Summ (a,b:real):real;stdcall; // сложение
begin
   result:=a+b;
end;
exports Summ; // экспорт в dll
 
begin // зачем это здесь? - не знаю
end.
Да в принципе на Делфи тоже не сложно DLL сделать.
Вот пример кода DLL - сложение двух чисел. Он больше, чем на PowerBasic по объёму. Но здесь мною написано лишь 5 строк - 9-13. Остальное компилятор сам вставляет.

А вот насчёт оптимизации - как её здесь делать, не знаю. Эта DLL весит 86 КБ.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 17:24
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от Craw Посмотреть сообщение
Эта DLL весит 86 КБ
К примеру Dll на ассемблере:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   .386
   .model flat,stdcall
   option casemap:none
   .code
   DllEntry proc hInstDLL:DWORD, reason:DWORD, reserved1:DWORD       ; Точка входа
           mov  eax,-1
           ret
   DllEntry Endp
 
   Summ proc USES edi esi Op1:DWORD, Op2:DWORD         ; Процедура сложения чисел
        mov eax,Op1
        add eax,Op2
        ret
   Summ endp
 
   End DllEntry


656 байт.
Вложения
Тип файла: rar DllAsm.rar (1.3 Кб, 10 просмотров)
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 17:32
Для вещественных:
Assembler
1
2
3
4
5
6
  Summ proc USES edi esi Op1:DWORD, Op2:DWORD         ; Процедура сложения чисел
        FINIT
        FLD dword ptr [Op1]
        FADD dword ptr [Op2]
        ret
   Summ endp
1
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 18:20
Цитата Сообщение от The trick Посмотреть сообщение
Dll на ассемблере
Асм это не ЯВУ.
На ЯВУ сможете добиться того же размера без танцев в бубном?

У мня получилось из этого кода:
Code
1
2
3
ProcedureDLL Summ(a, b)
  ProcedureReturn a + b
EndProcedure
создать dll, с размером файла - 768 байт.
Вложения
Тип файла: zip Test_dll.zip (488 байт, 11 просмотров)
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 18:33
Цитата Сообщение от locm Посмотреть сообщение
Асм это не ЯВУ.
На ЯВУ сможете добиться того же размера без танцев в бубном?
создать dll, с размером файла - 768 байт.
Что-то не работает Ваша Dll в VB.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 18:36
Цитата Сообщение от The trick Посмотреть сообщение
не работает
Появляется сообщение об ошибке или что?
В PB она нормально работает.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 18:41
Цитата Сообщение от locm Посмотреть сообщение
Появляется сообщение об ошибке или что?
Файл не найден. У меня такое появлялось когда в опциях линкера FILEALIGN < 512
Миниатюры
Создание DLL  
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.07.2013, 18:42  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Что-то не работает Ваша Dll в VB.
Не знаю как на VB будет, но у меня на Delphi она отлично работает!

Только что это за язык такой? В нём процедура и функция одно и тоже видимо!
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 19:04
Цитата Сообщение от The trick Посмотреть сообщение
У меня такое появлялось когда в опциях линкера FILEALIGN < 512
Похоже что это заморочка VB. В других ЯП проблем нет (проверил на XP и 7 при динамической и статической загрузке DLL). Линкеру VB должно быть все равно на размер выравнивания секций DLL. Это не его забота, а загрузчика DLL винды.

Цитата Сообщение от Craw Посмотреть сообщение
Только что это за язык такой?
Это PureBasic.

Разница между процедурой и функцией лишь в том, что первая не возвращает результат. Если в процедуре нет оператора ProcedureReturn, то она работает как процедура, а если есть, то как функция.
0
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.07.2013, 19:34  [ТС]
По Delphi специально поискал, как можно оптимизировать DLL на нём. Ведь, как я писал раньше, без оптимизации его объем 85 КБ.
В итоге у меня получилось минимум 14 КБ. Меньше никак.

Так что в плане экономии памяти DLL на PowerBasic лучше чем на Delphi.

Добавлено через 8 минут
Ещё есть вопрос по DLL.
У нас во всех примерах на VB здесь статическая загрузка DLL, т.е. при ней DLL выгружается из памяти при окончании работы программы. Это не экономно, т.е. если мы один раз использовали функцию из DLL и больше она нам не нужна, то она всё равно находится в памяти, готовая к использованию. Есть ещё динамическая загрузка, когда её можно выгрузить из памяти в любой момент, если она больше не используется.
Интересует, как это сделать.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 19:43
Цитата Сообщение от Craw Посмотреть сообщение
Интересует, как это сделать.
Используй WinAPI функции: LoadLibrary, GetProcAddress и FreeLibrary.
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 19:45
Цитата Сообщение от locm Посмотреть сообщение
Похоже что это заморочка VB.
Можно сказать так, VB импортирует функции посредством LoadLibrary и GetProcAddress. Для данной DLL LoadLibrary возвращает 0, поэтому не вызывается.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 19:56
Цитата Сообщение от The trick Посмотреть сообщение
Для данной DLL LoadLibrary возвращает 0
Почему же у меня эта функция загружает библиотеку (возвращает не 0)?
Путь к файлу был правильно указан?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 20:06
Цитата Сообщение от locm Посмотреть сообщение
Путь к файлу был правильно указан?
Да, попытаюсь разобраться. Возможно DLL на PB использует какие-нибудь библиотеки? Сейчас посмотрю через Dependency Walker
Миниатюры
Создание DLL  
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 20:22
Цитата Сообщение от The trick Посмотреть сообщение
Возможно DLL на PB использует какие-нибудь библиотеки?
Только MSVCRT.dll и Kernel32.dll. Они присутствуют в винде начиная с Win98.

У меня загружает (см. скрин). У вас случайно на x64 система?

Можете мне скинуть скомпилированную VB-прогу, которая загружает dll из корня диска C: (т. е. "C:\Test.dll")? Тогда узнаем в чем дело, в VB или в компе.
Миниатюры
Создание DLL  
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.07.2013, 20:34
Цитата Сообщение от locm Посмотреть сообщение
У вас случайно на x64 система?
Нет.
Скомпилировал, Dll загружается нормально, в IDE нехочет.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
27.07.2013, 20:36
То есть не загружается только при запуске в IDE?
А если запустить в IDE с отключенным отладчиком? Может в нем проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2013, 20:36

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
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