Аватар для Argus19
1449 / 466 / 78
Регистрация: 24.09.2017
Сообщений: 2,549
Записей в блоге: 24

Как написать библиотеку на С++ для программ на VB 6.0

19.12.2024, 18:58. Показов 5884. Ответов 58

Студворк — интернет-сервис помощи студентам
Часто разбрасываюсь и забываю о многом. Скомпилировал две статьи из интернета и добавил кое-что своё.
Прошу исправить ошибки, если что-то неправильно описал и дополнить, если что-то упустил. Делал фактически "на скаку".
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2024, 18:58
Ответы с готовыми решениями:

Написать синтезатор используя библиотеку conio.h для подключения клавиатуры и библиотеку Windows.h для Beep
Написать синтезатор используя библиотеку conio.h для подключения клавиатуры и библиотеку Windows.h для Beep(частота,длительность). ...

Как написать dll библиотеку для lua?
Скажите пожалуйста, как написать dll библиотеку для lua. попробовать так не вышло. // dllmain.cpp : Определяет точку входа для...

Как написать библиотеку для работы с сокетами?
Всем привет. Я написал программу клиент-сервер,передающую некий буфер серверу. Теперь хочу сделать это все в виде DLL библиотеки,однако...

58
 Аватар для Argus19
1449 / 466 / 78
Регистрация: 24.09.2017
Сообщений: 2,549
Записей в блоге: 24
28.10.2025, 05:31  [ТС]
Студворк — интернет-сервис помощи студентам
У меня скомпилировалась dll на VS2010. Работает на Wun XP и Win 10, а та же программа не видит dll из-под Win 7.
В начале файла у меня написано:
C++
1
2
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501  // Windows XP
Это может быть проблемой?
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
28.10.2025, 14:54
Цитата Сообщение от testuser2 Посмотреть сообщение
Я пробовал исключить из проекта "pch.h" и закомментировать #include "pch.h", в итоге библиотека не компилится.
Просто дополню, удалить "pch.h" действительно можно, отключив прекомпилированные заголовки в настройках проекта и всех файлов, в которых они были включены вручную. Также, спокойно можно исключить/закомментировать dllmain.cpp и закомментировать #include <windows.h>
Цитата Сообщение от Argus19 Посмотреть сообщение
Работает на Wun XP и Win 10, а та же программа не видит dll из-под Win 7.
Я заметил на vba, что если однократно выполнить LoadLibrary с полным путем библиотеки, то библиотека "подцепляется", даже если в декларациях не указан полный путь. Возможно это поможет.
Visual Basic
1
LoadLibraryW StrPtr(ThisWorkbook.Path & "\DLL3.dll")
Добавлено через 1 час 40 минут
Еще одно замечание по созданию библиотеки - заголовочник не обязателен, достаточно прописать все экспортируемые функции в файле .def.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
02.11.2025, 10:47
Пару слов стоит сказать про экспорт. В общем, как я выяснил __declspec(dllexport) это стандартный спцификатор экспорта функции с C и С++, если его указывать, то функции автоматически попадают в экспорт. Однако есть отичия, если мы пишем на C, то функции с __declspec(dllexport) будут экспортироваться с причудливыми именами. На C++ - функции экспортируются с нормальными именами, но, еще в добавок, с полной сигнатурой вызова (int __stdcall CCall5(void *,void *,void *,void *,void *,void *)). Не знаю как это работает, наверное в cpp загловочники встраиваются в библиотеку, также как idl. Если на С++ добавить extern "C", то функции экспортируются причудливо, как в C. Если делать COM-библиотеку(ATL), то лучше не использовать __declspec(dllexport), а только прописывать экспорты в файле .def, поскольку добавении функций в com-экспорт (в .idl) возникает конфликт имен - нельзя экспортировать функцию с __declspec(dllexport) и в idl/tlb с одним и тем же именем, но если использовать файл def, то можно, однако добавляется дополнительное бремя заполнения файла def, наряду с бременем заполнения файла idl. Если бы это делалось автоматически, было бы конечно лучше, т.е. существовали бы какие-то спецификаторы, для экспорта функции в com. Но, кстати говоря, в VB6 насколько знаю, вообще нету встроенной возможности экспортировать функции, только классы.

Добавлено через 8 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
возникает конфликт имен - нельзя экспортировать функцию с __declspec(dllexport) и в idl/tlb с одним и тем же именем
По этой же причине, нельзя прописывать в idl WinApi-функции, c их истинными именами, поскольку они прописаны в стандартных заголовках, впрочем изменить имя функции, весьма просто, достаточно изменить регистр одной из букв.
0
Модератор
Эксперт Java
 Аватар для alecss131
2894 / 1400 / 412
Регистрация: 11.08.2017
Сообщений: 4,482
Записей в блоге: 2
02.11.2025, 11:44
Цитата Сообщение от testuser2 Посмотреть сообщение
Однако есть отичия, если мы пишем на C, то функции с __declspec(dllexport) будут экспортироваться с причудливыми именами. На C++ - функции экспортируются с нормальными именами, но, еще в добавок, с полной сигнатурой вызова (int __stdcall CCall5(void *,void *,void *,void *,void *,void *)). Не знаю как это работает, наверное в cpp загловочники встраиваются в библиотеку, также как idl. Если на С++ добавить extern "C", то функции экспортируются причудливо, как в C.
Всё с точностью до наоборот, в Си имена нормальные, а вот в С++ они меняются, я уже писал про Name mangling
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
02.11.2025, 13:19
Цитата Сообщение от alecss131 Посмотреть сообщение
Всё с точностью до наоборот
Может быть, но когда я VS я делаю расширение файла с функцииями *.c то при компиляции они компилируются видоизмененными именами, а из *.cpp функции компилируются с информацией о сигнатурах. Если использовать файл def, то функции комплируются с нормальными именами (без косметики), для com-экспорта это самое то. А для C может быть хорош сишный вариант.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
03.11.2025, 12:59
Еще один момент, касаемо экспорта - если экспортировать с помощью declspec функцию из .c-модуляфайла (мне хочется называть это модулем, хотя везде пишут файл) то она должна иметь нормальное имя если это cdecl-функция, и с видоизмененным именем, если stdcall.
Еще момент, чтобы в cpp-файле увидеть функцию из с-файла нужно прописать эту функцию в заголовочнике так
C++
1
2
3
4
5
6
7
#ifdef __cplusplus
extern "C" {
#endif
void exaple_с_func(void);
#ifdef __cplusplus
}
#endif
и заинклюдить этот заголовочник там где надо использовать функцию
0
Модератор
Эксперт Java
 Аватар для alecss131
2894 / 1400 / 412
Регистрация: 11.08.2017
Сообщений: 4,482
Записей в блоге: 2
03.11.2025, 21:19
Цитата Сообщение от testuser2 Посмотреть сообщение
нормальное имя если это cdecl-функция, и с видоизмененным именем, если stdcall
Зависит от битности, на 64 битах различия только в том кто чистит стэк, а в именах и передаче параметров функции через регистры все одинаковое, уже писал про это. Имена меняются только на 32 битах.
void в параметрах функции старый стандарт языка Си, в новых это не обязательно.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
05.11.2025, 02:22
Цитата Сообщение от alecss131 Посмотреть сообщение
Зависит от битности, на 64 битах различия только в том кто чистит стэк
Я раньше читал про это (если можно так выразиться, поскольку я пользовался для этого нейросетью), о том, что на x64 используется единое соглашение 64-call или еще называется fastсall. Вот сейчас я обнаружил, что обертки cdecl-вызовов у меня не работают на x64, хотя на x86 работают, наверное надо писать какую-то предиктиву компиляции относительно соглашений. Так выглядит моя cdecl-обертка
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef INT64(__cdecl *cfun2)(void*, void*);
typedef void(__cdecl *csub2)(void*, void*);
typedef void(__cdecl *csub3)(void*, void*, void*);
void CCall2(INT_PTR fn, void* ret, int retSz, void* a1, void* a2){
    if (ret != NULL){
        if (retSz <= 8){
            INT64 ret64 = ((cfun2)fn)(a1, a2);
            memcpy(ret, &ret64, retSz);
        }else{
            ((csub3)fn)(ret, a1, a2);
        }
    }else{
        ((csub2)fn)(a1, a2);
    }
}
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
07.12.2025, 04:02
Я вот что заметил, хотел использовать другие библиотеки в своей библиотеки, но заметил странную особенность - если эти библиотеки недоступны, то моя библиотека перестает подключаться в VBA - LoadLibrary возвращает 0. Это конечно не лучший сценарий, но такова данность этого мира видимо.
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
07.12.2025, 10:02
testuser2, линкуй статически если либы позволяют.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
07.12.2025, 10:46
The trick, можно, конечно и так, библиотеки там не большие, я хотел подключал minizip, который, в свою очередь зависит от zlib, но хотелось бы все-таки иметь какое-то решение, для чисто динамического подключения. Вот сейчас думаю, можно парсить заголовочники и все функции преобразовывать в указатели + делегаты + формировать файл инициализации всех указателей
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
07.12.2025, 10:52
testuser2, ну а зачем? Загрузчик именно это и делает.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
07.12.2025, 11:16
The trick, чтобы библиотеки не грузились, если они не нужны, ну еще может компиляция побыстрее будет без дополнительного "балласта", хотя х.з. Я вообще я, конечно, пока не доконца вдупляю, что есть заголовочники, открыл сейчас один, а там функции целиком вместе с реализацией.

Добавлено через 10 минут
Цитата Сообщение от The trick Посмотреть сообщение
ну а зачем?
Скажем так, для абсолютизации идеи динамической загрузки. А то получается, так, что библиотека вроде бы "динамическая", но она принуждает программу загружат все ее зависимости, которые также динамические (dynamic-link library), это как-то не очень логично, чтоли.
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
07.12.2025, 11:23
testuser2, есть же отложенный импорт, при котором либа грузится только при первом обращении к функции из нее.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
07.12.2025, 12:00
Цитата Сообщение от The trick Посмотреть сообщение
есть же отложенный импорт
И как он работатет - при первом обращении либа грузится, и вместе с ней все зависимости, или это универсальный механизм для вообще всех dll? Потом есть еще одна не маловажная неприятность - если отсутствуют какие-то зависимости, то библиотека не подключается вообще, и, очевидно, нет возможности как-то поменять это поведение стандартными методами.
0
Модератор
10061 / 3906 / 885
Регистрация: 22.02.2013
Сообщений: 5,856
Записей в блоге: 79
07.12.2025, 12:03
testuser2, https://learn.microsoft.com/en... w=msvc-140
1
Модератор
Эксперт Java
 Аватар для alecss131
2894 / 1400 / 412
Регистрация: 11.08.2017
Сообщений: 4,482
Записей в блоге: 2
07.12.2025, 12:35
Цитата Сообщение от testuser2 Посмотреть сообщение
я хотел подключал minizip, который, в свою очередь зависит от zlib
Как можно избавиться от zlib если он реализует функции сжатия/распаковки данных для minizip, а сам minizip тут просто читает/пишет структуру файла? И да как уже было сказано, zlib можно статически прилинковать к minizip и будет только одна dll
Цитата Сообщение от The trick Посмотреть сообщение
есть же отложенный импорт
Только для этого придется переписывать готовые библиотеки, ведь то что есть обычно если использует сторонние зависимости, то требует их сразу.
Цитата Сообщение от testuser2 Посмотреть сообщение
А то получается, так, что библиотека вроде бы "динамическая", но она принуждает программу загружат все ее зависимости, которые также динамические (dynamic-link library), это как-то не очень логично, чтоли.
Все логично, это считайте загружаемая библиотека состоит из частей, это как хотеть автомобиль, но пытаться использовать его без важных частей двигателя.
Цитата Сообщение от testuser2 Посмотреть сообщение
без дополнительного "балласта"
Это не балласт, а части библиотек отделенные в другие библиотеки. Вся эта дрянь (разделение на библиотеки) тянется из линуксов, где такое уменьшает вес. На винде такое разделение на dll только будет мешаться и вставлять палки в колеса, так как разные версии будут конфликтовать между собой.
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
07.12.2025, 14:18
Цитата Сообщение от The trick Посмотреть сообщение
https://learn.microsoft.com/en... w=msvc-140
Отлично, делается так: в настройках проекта -> Компоновщик -> Дополнительные зависимости - в строку добавляем еще одну зависимость ;delayimp.lib, в поле "отложенно загружаемые dll пишем все dll которые нужно отложенно грузить (в моем случае zlib.dll;minizip.dll). Скомпилировал - открыл VBA, LoadLibrary возвратила указатель. При попытке вызвать dll-зависимой функции возникло необрабатываемое исключение, но это хорошо, нужно теперь в самой функции сделать проверку инициализации либ, или просто отдельную экспортируемую функцию инициализации. А уже процедура инициализации будет искать библиотеки в директории моей библиотеки и в папке вызывающего приложенияvba-проекта, как я это хотел сделать.

Добавлено через 23 минуты
Цитата Сообщение от alecss131 Посмотреть сообщение
Только для этого придется переписывать готовые библиотеки, ведь то что есть обычно если использует сторонние зависимости, то требует их сразу.
Представьте себе супер-многофункциональную библиотеку (почему нет?) которая может использовать 10+ зависимостей, а может не использовать, но точно не будет исользовать их каждый раз.
Цитата Сообщение от alecss131 Посмотреть сообщение
Все логично, это считайте загружаемая библиотека состоит из частей, это как хотеть автомобиль, но пытаться использовать его без важных частей двигателя.
Речь не о двигателе, представьте себе, например, такую вещь как съемный подогрев сидений который можно поменять на новый, отключить и убрать в летний период.
Цитата Сообщение от alecss131 Посмотреть сообщение
На винде такое разделение на dll только будет мешаться и вставлять палки в колеса, так как разные версии будут конфликтовать между собой.
Сам я с этим не сталкивался, но, вижу это как не грамотный dll-менеджмент, по скольку, на мой взгляд эту проблемму можно довольно просто решить, с помощью единого хранилища и символических ссылок, я уже об этом писал в одной теме, кажется.

Добавлено через 21 минуту
Все как-то оказалось сложнее, после манипуляций которые я описал у меня в папку проекта при сборке попадаются minizip.dll и zlib.dll. R zlib.dll зачем-то добавляется еще клон zlib1.dll, идентичный по размеру, у minizip нет такого клона. В VBA LoadLibrary грузит zlib.dll, но не грузит minizip, в общем какой-то бардак
0
1406 / 864 / 93
Регистрация: 08.02.2017
Сообщений: 3,683
Записей в блоге: 2
08.12.2025, 17:00
Цитата Сообщение от testuser2 Посмотреть сообщение
зачем-то добавляется еще клон zlib1.dll
Ответ от нейросети
Основная причина в том, что официальные релизы zlib для Windows используют имя zlib1.dll, а не zlib.dll. Версия 1 в названии отражает номер версии API (Application Binary Interface), что помогает избежать конфликтов при обновлении библиотеки. vcpkg (я использовал vcpkg), как репозиторий, следует этим устоявшимся правилам именования.
Что интересно, вместо zlib1.dll можно использовать символическую сслку с таким именем, указывающую на просто zlib.dll и minizip ее также подхватывает. Симлинки очень интересная вещь, правда требуют повышения прав для их создания, этого я понять не могу, зачем в винде такое ограничение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2025, 17:00

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

Copy Hook. Или как написать библиотеку для перехвата копирования
Возник такой интересный вопрос. Я пользуюсь программой SuperCopier2. Эта программа заменяет стандартный диалог копирования\перемещения, но...

Как написать тест программ для след класса
Задача написать тест программу кот выполняет проверку Student class: The three-argument Student class constructor The enroll member...

Как используя библиотеку fsream записать в одну строку результаты из двух программ?
У меня есть имеется 2 программы, которые записывают результат в csv файл. Из первой программы записывается значение Opt из второй все...

Ищу библиотеку для создания программ обмена между ПЛК и ПК через программатор AMSAMOTION (USB - MPI адаптер)
И второй вопрос - имеется программатор AMSAMOTION (USB - MPI адаптер). Где можно скачать библиотеку и документацию к драйверу для данного...


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

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

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru