|
|
|
Как написать библиотеку на С++ для программ на VB 6.019.12.2024, 18:58. Показов 6417. Ответов 58
Часто разбрасываюсь и забываю о многом. Скомпилировал две статьи из интернета и добавил кое-что своё.
Прошу исправить ошибки, если что-то неправильно описал и дополнить, если что-то упустил. Делал фактически "на скаку".
1
|
|
| 19.12.2024, 18:58 | |
|
Ответы с готовыми решениями:
58
Как написать dll библиотеку для lua? Как написать библиотеку для работы с сокетами? |
|
COM‐пропагандист
|
||
| 23.12.2024, 13:45 | ||
|
В обычном случае этими расширениями можно пренебречь и вызывать функции из oleaut32.dll напрямую.
0
|
||
| 23.12.2024, 14:04 | ||
|
0
|
||
|
COM‐пропагандист
|
||
| 23.12.2024, 15:08 | ||
|
Берём какой‐нибудь другой компилятор, например, GCC. И там уже не будет этих basic_string и variant. Есть только стандартные структуры типа BSTR и VARIANT. Корпорация выпускающая компилятор GCC вправе создать свои классы, которые будут инкапсулировать BSTR и VARIANT и назвать их например b_str и Variant, и наделать к ним других методов, например, GetLength, а не len. Поэтому basic_string и variant — это никакой не межъязыковой стандарт. Межъязыковой стандарт — это BSTR и VARIANT, на них и надо опираться.
1
|
||
| 24.12.2024, 02:24 | |
|
Argus19, при работе с внешними библиотеками важно понимать несколько вещей
1) VB6/VBA стандартно поддерживает только тип вызова stdcall, поэтому в c++ библиотеке надо делать stdcall-экспорт функций. Если поставить дополнение CDeclFix The trick-а, то можно будет работать и с cdecl - стандартным типом вызова для C/C++. 2)Большие типы, такие как массивы, строки, структуры, Variant из VB во внешние вункции передаются всегда по указателю (ByRef). Строку можно передать ByVal, но при этом все равно будет передаваться указатель на буфер строки (если ByRef, то указатель на переменную строки). Variant можно передатm ByVal, но обычно так не делается, а передается он ByRef. Структуры передаются только ByRef поэтому в С++ надо аргумент определять как указатель на структуру 3)аналогию типов VB-C++ можно брать в таблице стандартных типов Windows, там тупо надо смотреть по размерам. Int = Long, char = Byte и т.д. В VB не поддерживаются беззнаковые целые, знакове char наверное это тоже надо учитывать. 4)Понимание структуры стандартных типов. Строковая переменная в VB это то же самое что переменная типа Long в которую записан указатель на буфер строки, только она обрабатывается как строка. Переменная массива это то же самое, тольк записан указатель на структуру safearray, в переменной объекта указатель на структуру объекта. Со стороны С++ думаю объяснять не нужно там все должно быт просто )
1
|
|
|
Модератор
|
|
| 24.12.2024, 06:29 | |
|
1
|
|
|
|
||
| 24.12.2024, 20:46 [ТС] | ||
|
Я всё понимаю, понимаю, что мои знания поверхностны и обывочны. Допишите статью с примерами и укажите ваше авторство. Нет проблем. Я работаю в фармацевтической кампании, кругом одни дебилы с искренними глазами. Учиться никто не хочет. Мне пока 64 года и я ничего не могу изменить. Сейчас основная задача: научиться вытаскивать прошивки из контроллеров SIEMENS, сохранить их на серваке и при необходимости залить обратно. Если напишете пошаговую инструкцию, буду весьма признателен. И, даже, если я научусь это делать, передать знания, мне некому. Всем на всё насрать. Все искренне хотят сделать "как лучше". Горит всё. И завод налетает на кучу бабок.
0
|
||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 24.12.2024, 21:19 | |
|
У нас же импортозамещение на первом месте. Газовые турбины SIEMENS например поменяют на новые российского производства. Надеюсь уже произвели, чтобы не зависеть от немцев.
Добавлено через 55 секунд Хотя при чём тут программирование... Там явно не на VB6 всё это ПО...
0
|
|
|
|
|||
| 24.12.2024, 23:42 [ТС] | |||
|
Препод даже не знает о современных твердотелках с двумя входами: Вход "Вкл" и переход через ноль. Т.к. IGBT транзисторы это сложно. он будет нам втирать, как отключать тиристоры RC-цепочкой. которые надо будет считать. Высший пилотаж? Я таких инженеров скоро убивать буду. Достали отстоем из прошлого века. И пусть ракеты падают.
0
|
|||
| 05.10.2025, 11:15 | |||||||||||||||||||||||||||||||
|
При содействии deepserk сделал простую библиотеку с одной функцией, перемножающей два числа типа double на Visual Studio.
Делал так: при создании проекта выбрал "Библиотека динамической компоновки с экспортом", название проекта "Dll1". При создании проекта автоматически создаются файлы Dll1.h, dllmain.cpp, pch.h В dllmain.cpp почти ни чего менять не нужно, только добавить сверху #include "pch.h" dllmain.cpp
Создаем Dll1.cpp и добавляем в него код Dll1.cpp
Dll1.h
"Проект" -> "Добавить новый элемент" -> "Код" -> "Файл определения модуля (.def)" Dll1.def
в pch.h ни чего неменяем Далее нужно перевести проект из режима "Debug" в "Release", "Сборка" - > "Собрать решение" Тест в vba
Следующей задачей хотелось бы сделать com-библиотеку, подключаемую в референсах в которой должна быть встроена tlb, а в ней задекларирована функция также, как в vbe7.dll Так определены функции в vbe7.dll Кликните здесь для просмотра всего текста
Если сделать такую же библиотеку, то не нужно будет писать определения, Declare, все функции будут доступны, только как это сделать, наверное сложно..
2
|
|||||||||||||||||||||||||||||||
|
Модератор
|
|||
| 05.10.2025, 11:34 | |||
|
Как пишется на сайте мелкомягких, можно обойтись без def файла добавив предложение alias в оператор Declare Да и если код чисто Сишный, то есть без классов и всего плюсового, то имхо лучше писать код в .c файлах, а не .cpp и тогда можно обойтись без extern "C"
1
|
|||
| 05.10.2025, 14:34 | ||||||||||||||||||
|
Добавлено через 1 час 28 минут Собрал com-библиотеку с одной функцией (Multiply), библиотека подключается в референсах, функция видна в обозревателе обхектов. Но при попытке использовать функцию возникает ошибка File not found: SimpleMathCOM.dll с чем это может быть связано обхясните пожалуйста Господа The trick, alecss131Добавлено через 1 минуту Думал скину проектик, а он там на 200+ мегов.. пустой-то Добавлено через 4 минуты SimpleMathCOM.cpp
SimpleMathCOM.def
SimpleMathCOM.idl
Добавлено через 4 минуты Вот сам проект Добавлено через 1 час 6 минут
1
|
||||||||||||||||||
| 07.10.2025, 12:31 | |
|
Argus19, я их сгенерил на первом попавшемся онлайн-генераторе, забыл об этом упомянуть, еще о том, что лучше компилировать с повышенными правами, чтобы библиотека автоматически зарегилась.
Добавлено через 18 минут Как я еще понял, [entry("Multiply")] можно было опустить, или указать ординал [entry(1)]. В vbe7.dll везде используются ординалы. Добавлено через 1 минуту А прописываются ординалы (номера функций), наверное в файле .def
0
|
|
| 27.10.2025, 12:48 | |||||||||||||||||||||||||||
|
Далее по пунктам: * Cоздаем проект библиотеки (Dll4). * Заходим в настройки проекта >> C/C++ >> Соглашеие о вызовах выбираем __stdcall (/Gz). После этого все создаваемые функции в проекте по умолчанию будут __stdcall и не нужно будет это специально прописывать. Такую настройку можно конечно делать, не обязательно для всего проекта, а можно только для отдельных модулей (файлов) * Добавляем файл .def. Он автоматически прописывается в свойствах проекта (Компоновщик >> Ввод). Однако если мы удалим/исключим его из проекта (его также надо будет удалить из свойств проекта), или надо будет изменить его название, то в дальнейшем надо его будет прописывать в свойствах руками. Dll4.def
* Добавляем файлы MulFunc.cpp и DivFunc.c MulFunc.cpp
DivFunc.c
* Dll4.h добавляется автоматически. В нем я оставил стандартные штуки, но оставил незакомментированными только экспорты. Dll4.h
* В свойствах DivFunc.c (С/C++ >> Предварительно откомпилированные заголоки) нужно выбрать "Не использовать предварительно сокмпилированные заголовки". Без этого у меня библиотека не компилировалась, наверное потому, что C не поддерживате эти самые.. Вроде бы все, надеюсь ни чего не забыл. Что не получилось у меня, это избавиться от #include "pch.h" в каждом модуле кода. От самого pch.h, то беж от предкомпилированных заголовков я отказываться не хотел, поскольку вещь априоре должна быть нужная, наверняка это важно при компиляции под разную битность.Добавлено через 7 минут Тест в VB/VBA
0
|
|||||||||||||||||||||||||||
|
Модератор
|
||
| 27.10.2025, 16:37 | ||
|
В студийном компиляторе от подобных вещей __declspec(dllexport) отказываться не стоит, иначе не будет видно функции, а при отказе от extern "C" плюсовые функции будут менять имена, хотя при наличии def файла это не так важно, так как используются номера а не имена.Для 64 бит различия между stdcall, cdecl и fastcall будет только в том кто чистит стэк. Получается что в cdecl стэк чистит вызывающая функция, а в двух других вызываемая. Есть еще thiscall, но он чисто плюсовый, в регистре ecx указатель this, стэк чистит вызываемая функция.
1
|
||
| 27.10.2025, 16:51 | ||
|
0
|
||
|
Модератор
|
||||||||||||||||||||||||||||||||
| 27.10.2025, 21:55 | ||||||||||||||||||||||||||||||||
|
Это вот эта штука __declspec(dllimport) является не обязательной, работает без нее, но она сэкономит пару ассемблерных инструкций разве что.Советую поиграться с утилитой dumpbin из студии, например так dumpbin /exports name.dll на выходе покажется все то что можно вызывать из dll, там как раз будут все те функции которые помечены __declspec(dllexport)Это в гнутом компиляторе (mingw/gcc) такое не нужно, там все функции экспортируются. Добавлено через 4 часа 55 минут testuser2, Вот пример, нету Вашего языка, попробуйте. Все выполнять в x64 Native Tools Command Prompt for VS 2022вот файл test.cpp, демонстрирующий разные результаты
extern "C", а у одной нету __declspec(dllexport)соберем ее, первая команда компиляция, вторая линковка в dll
fun у которой как раз не было __declspec(dllexport), что значит что вызвать ее из этой dll не выйдет. У функции mul имя поменялось на ?mul@@YAHHH@Z так как у нее не было extern "C", этот процесс строго определенный и известный (Name mangling)И небольшой тестовый код main.c
mul по номеру ordinal из dumpbin, во втором add так же по номеру, в третьем функцию mul по имени (надо использовать все длинное), а в четвертом sub по короткому имениПопробуйте вызвать собранную dll из этого поста из своего языка. По сути это минимальный пример dll.
1
|
||||||||||||||||||||||||||||||||
| 28.10.2025, 01:47 | |||
|
Добавлено через 8 минут #include "pch.h", в итоге библиотека не компилится. Потом пробовал вернуть обратно и восстановить компиляцию все-равно не получилось. В итоге я смекнул, что "pch.h" это какой-то неубираемый костыль, который лучше не трогать.
0
|
|||
| 28.10.2025, 01:47 | |
|
Составить библиотеку программ для решения матричных уравнений Copy Hook. Или как написать библиотеку для перехвата копирования Как написать тест программ для след класса Как используя библиотеку fsream записать в одну строку результаты из двух программ? Ищу библиотеку для создания программ обмена между ПЛК и ПК через программатор AMSAMOTION (USB - MPI адаптер) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|