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

Создание DLL

23.07.2013, 16:20. Показов 14558. Ответов 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
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 14
25.07.2013, 14:36
Студворк — интернет-сервис помощи студентам
В PowerBasic я оптимизацию не трогал. Просто взял - и скомпилировал. Не настаиваю, что PowerBasic порождает самый лаконичный код. А Ваш пример на каком Бэйсике?

Добавлено через 7 минут
А, увидел... Но тогда почему кто-то писал, что у PureBasic есть проблема в этом вопросе?
0
 Аватар для Pro_grammer
6807 / 2840 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
25.07.2013, 15:19
Цитата Сообщение от Catstail Посмотреть сообщение
что у PureBasic есть проблема в этом вопросе?
Как раз наоборот. Проблема у VB6 в этом вопросе - та dll, которая была создана с помощью кода от SCINER больше ни где не работает, кроме как на самом VB6.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38228 / 21160 / 4314
Регистрация: 12.02.2012
Сообщений: 34,774
Записей в блоге: 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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 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
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
27.07.2013, 18:33
Цитата Сообщение от locm Посмотреть сообщение
Асм это не ЯВУ.
На ЯВУ сможете добиться того же размера без танцев в бубном?
создать dll, с размером файла - 768 байт.
Что-то не работает Ваша Dll в VB.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
27.07.2013, 18:36
Цитата Сообщение от The trick Посмотреть сообщение
не работает
Появляется сообщение об ошибке или что?
В PB она нормально работает.
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 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
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 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
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
27.07.2013, 19:43
Цитата Сообщение от Craw Посмотреть сообщение
Интересует, как это сделать.
Используй WinAPI функции: LoadLibrary, GetProcAddress и FreeLibrary.
1
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
27.07.2013, 19:45
Цитата Сообщение от locm Посмотреть сообщение
Похоже что это заморочка VB.
Можно сказать так, VB импортирует функции посредством LoadLibrary и GetProcAddress. Для данной DLL LoadLibrary возвращает 0, поэтому не вызывается.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 7
27.07.2013, 19:56
Цитата Сообщение от The trick Посмотреть сообщение
Для данной DLL LoadLibrary возвращает 0
Почему же у меня эта функция загружает библиотеку (возвращает не 0)?
Путь к файлу был правильно указан?
0
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
27.07.2013, 20:06
Цитата Сообщение от locm Посмотреть сообщение
Путь к файлу был правильно указан?
Да, попытаюсь разобраться. Возможно DLL на PB использует какие-нибудь библиотеки? Сейчас посмотрю через Dependency Walker
Миниатюры
Создание DLL  
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
27.07.2013, 20:34
Цитата Сообщение от locm Посмотреть сообщение
У вас случайно на x64 система?
Нет.
Скомпилировал, Dll загружается нормально, в IDE нехочет.
0
Эксперт по электронике
7236 / 3414 / 348
Регистрация: 28.10.2011
Сообщений: 13,427
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru