|
|
|
Подключить библиотеку dll01.03.2017, 09:35. Показов 13331. Ответов 166
Метки нет (Все метки)
Данным диалектом Бейсика не пользуясь, но иногда здесь бываю. Решил немного поучаствовать. Собственно вопрос в следующем: можно ли пользоватся сторонними библиотеками в этом диалекте, насколько сложен процесс использования? Цель - есть своя xll для VBA, можно убрать обертку будет dll, выложу здесь для тех кто много считает, большими числами) (Гугл не спрашивал ибо важно понять, есть целесообразность в данном продукте?)
0
|
|
| 01.03.2017, 09:35 | |
|
Ответы с готовыми решениями:
166
Не получается подключить библиотеку Unmanaged.dll (Firefox nss3.dll) Подключить библиотеку dll Как подключить dll библиотеку? |
|
Кормпилятор
|
|||||
| 01.04.2018, 00:10 | |||||
|
а не тыкать пальцем - нужно изучить. Т.е. осознавать, что реально происходит с данными в памяти. Чтобы изучить этот самый COM, помню, люди говорили надо прочитать и понять стопку толстых книг, что для меня не один год. Т.е. делать это ради того, чтобы протестировать чью-то программу - занятие нецелесообразное. Просто так лезть не понимая сути вопроса - это ну совсем бичарство, так не делаю. Просто не могу понять зачем всё это вообще нужно. В чём профит простыми словами? Т.е. чтобы открыть этот драный COM нужно переписать тот исходник Анатолия на FB. А чтобы его переписать нужно понять, что он делает, что делает каждая его функция, это время, т.е. дофига времени.
0
|
|||||
|
|
|
| 01.04.2018, 10:26 [ТС] | |
|
Не думал что так сильно отличаются диалекты Basic. В VBA - подключение элементарно одной строкой CreateObject("имя библиотеки") . как по мне куча толстых книг нужна разработчику (да и это в случае если с нуля делать все руками, что редкость), клиенту только знать как подключить.
Профит если совсем просто в том, что можно реализовать ООП в dll, на разных языках и для разных языков, т.е. передать класс/объект между языками/компиляторами. А это в свою очередь нужно, т.к. есть структуры(классы), которые нельзя привести к стандартным типам, которые можно было бы передать через win api функции или процедурные dll (моё узкое мнение, специалисты поправят, если где нужно).
0
|
|
| 01.04.2018, 12:20 | |
|
0
|
|
|
Кормпилятор
|
||||
| 01.04.2018, 14:07 | ||||
|
непреклонно растёт, к сожалению. И мы, старые вояки кодеры, начинаем себя даже комфортнее чувствовать. вот вы к примеру знаете для чего и для кого вы пишете? Судя по постам знаете, но тогда если мало или нет тестеров то нужна подача какая-то более грамотная, например видео по использованию, посты на форумах и т.п. Это говорю к тому, что у меня, например, своей литературы и исходников столько, что до конца жизни разгребать, особенно когда ещё голова забита другими вещами. Анатолий(the trick) прекрасно понимает что это за область, но он, конечно, более прошаренный и талантливый во всех смыслах, мне до его уровня пердеть и пердеть. хожу по протоптанной дорожке.
0
|
||||
|
Модератор
|
|||||||||||||||
| 01.04.2018, 21:03 | |||||||||||||||
|
Quiet Snow, Очень-очень грубо. Вот к примеру если ты хочешь использовать какую-либо функцию из DLL, то ты вызываешь LoadLibrary и GetProcAddress. Также ты можешь к примеру добавить функцию в импорт, что по сути тоже самое только адреса предоставит сама система. Это ясно. В COM ты получаешь не адрес функции, а адрес на таблицу функций. Эта таблица функций называется интерфейсом. К примеру любой COM объект обязан реализовывать интерфейс IUnknown. Т.е. если ты создаешь какой-либо объект и запрашиваешь у него этот интерфейс то ты гарантировано получишь указатель на указатель на 3 функции: QueryInterface; AddRef; Release. Любой другой интерфейс должен наследоваться от IUnknown, это обозначает что любой интерфейс первыми тремя функциями содержит эти функции (QI, A, R). Запрос интерфейса осуществляется вызовом QueryInterface. К примеру ты разрабатываешь какую-либо DAW и хочешь реализовать к ней плагины. Ты разрабатываешь интерфейc ISoundProcess который содержит 3 метода: SetSampleRate; - установить частоту дискретизации. SetVolume; - установить громкость. Process; - обработать/сгенерировать звук, в зависимости от типа. Все, Теперь любой разработчик может создать COM DLL в которой будует объект/объекты реализующие этот интерфейс. Твой хост просто запрашивает этот интерфейс и получает указатели на функции которые уже индивидуальны для каждого плагина/объекта. Таблица всегда одинакова, а функции разные. Один плагин к примеру будет на Process генерировать пилу, а другой добалять Хорус. Это удобно. В хосте ты просто пишешь вроде того:
Далее к примеру ты опционально хочешь добавить возможность реализации GUI для плагина. Создаешь еще один интерфейс IGUIPlugin, в котором описываешь методы типа SetHwnd и т.д. И любой COM объект из Dll может поддерживать этот интерфейс. Удобно? Да конечно можно сделать как говорит locm, вместо одной функции просто экспортировать каждый метод по отдельности и вызывать его, передавая каждый раз указатель на объект идентифицирующий плагин/эффект. Но если к примеру ты захочешь сделать более отказоустойчивую систему, то ты можешь COM объект загрузить в другой процесс. Или к примеру твое приложение 64 битное а Dll 32 битная, ты просто используешь COM surrogate (dllhost.exe). Но фишка в том что от тебя почти ничего не требуется, в хосте как был код так и остался (к примеру посмотри работу с Excel/Word из VB6 там объект живет в другом процессе, а работаешь ты с ним точно также как с любым другим). Всю работу по синхронизации, транспортировке данных между процессами берет на себя Windows. Попробуй теперь так с экспортом функций сделать? Второй момент, если твоя DLL работает в многопоточном приложении и ты опрашиваешь объект из разных потоков то становится критичной проблема синхронизации. В STA каждый объект изолирован и всю работу по синхронизации выполняет Windows. Ты также просто вызываешь метод объекта, Windows транспортирует данные между потоками, ждет обработки и возвращает результат, тебе не нужно думать о синхронизации и т.п. ты просто вызываешь метод (функцию по указателю). COM объект работает в том потоке в котором был порожден и никаких проблем с синхронизацией не возникает. Удобно? Попробуй сделать тоже самое с экспортом функций. Фишка в том что от разработчика эти действия не требуются это реализуется все Windows.
2
|
|||||||||||||||
|
|
||||
| 01.04.2018, 22:42 [ТС] | ||||
|
The trick, хороший пост, плюсую вам. Все заворачивать в отдельную функцию и передавать посредством "EXPORTS" и "_stdcall", а в VBA смотреть через Declare? Выходит 50 "Declare", вместо одного CreateObject? Можно прямо на пальцах (если вас не затруднит), можно терминами VB, можно С, любыми другими (по вышепоказанным вами функциям, честно пытался усвоить инфо, видимо пока борода не выросла, не понимаю, что там бородатые дядьки запилили).
0
|
||||
|
Модератор
|
||||||||||
| 01.04.2018, 23:11 | ||||||||||
0
|
||||||||||
| 01.04.2018, 23:35 | ||
|
Не по теме: Анатолий, это всё очень сложно для моих старых мозгов. С нахрапу не въеду. Уже не кодил Сам ещё даже твой пример не раскурил по первой версии, тот что на ассемблере. На мой взгляд единственный дельный мануал по теме(ну кроме других твоих манов по звуку, там тоже всё кошерно), в других же источниках - одни бичи дешёвые и безалаберные :D .
0
|
||
|
|
|
| 02.04.2018, 00:47 [ТС] | |
|
The trick, благодарю за ответы. Попытаюсь понять ваши и пояснить свои мысли.
Используя new мы можем создать несколько объектов одного и того же класса, со своими значениями свойств и методами, как этого достичь в процедурной dll? Про какой интерфейс вы упоминаете, в случае передачи объекта через api в процедурной dll без использования СОМ. Как без СОМ передать объект из процедурной dll, пусть из VB6(вам он ближе?) в VBA. Если все же СОМ нужен, то передавая через api в функции этот объект, как vba знает про его интерфейс, регистрация в реестре, манифест? Как его можно использовать? Пока не пойму.
0
|
|
|
Модератор
|
|||||||||||
| 02.04.2018, 10:05 | |||||||||||
![]()
0
|
|||||||||||
|
Модератор
|
||||||||||||||||
| 02.04.2018, 12:10 | ||||||||||||||||
|
Quiet Snow,
Вот простейший пример использования COM библиотеки из ассемблера (думаю это самый простой способ, не в машинных кодах же писать? ). Имеем простую ActiveX dll библиотеку написанную на VB6. В ней есть класс CTest:
CLSID - это идентификатор класса, IID - это идентификатор интерфейса. Любой класс обязан реализовывать какой-нибудь интерфейс. CLSID - однозначно определяет реализацию, а IID однозначно определяет "канал" взаимодействия. К примеру тут класс CTest, а интерфейс _CTest. Любой другой класс также может реализовывать интерфейс _CTest а метод ShowMsgBox может уже делать что-то другое. Теперь напишем клиент для этой dll, на ассемблере (FASM): Без деклараций и проверок на ошибок код совсем маленький:
Не сложнее LoadLibrary и GetProcAddress. Вызов метода это просто вызов функции по указателю с передачей указателя на объект в первом параметре. Все! Никаких надуманных сложностей, километровых кодов и т.п. Дополнительно имеем большое количество преимуществ о которых я писал ранее. Если нужно сделать работу без регистрации можно и правильнее создать Reg-Free манифест либо вручную вызвать DllGetClassObject как в моем примере в блоге. Манифест также очень простой:
Если угодно можно создать объект по имени (не по CLSID), как это делается в скриптовых языках или в VB/VBA (CreateObject), просто получив CLSID по имени (ProgId) через функцию CLSIDFromProgId. В манифесте просто нужно добавить атрибут progid="TestLib.CTest".
0
|
||||||||||||||||
|
|
||
| 02.04.2018, 12:28 [ТС] | ||
|
Благодарю, действительно интересно. По первой части сообщения, в общем понятно. Под COM я подразумеваю интерфейсы COM. Выходит, как я писал выше, нужно 50 Declare Function, что бы работать с библиотекой (на количество свойств и методов), все верно?
Вторая часть посложнее: 1. При Reg-Free методе, в функцию должно передаваться местоположение DLL(манифеста)? (ведь в реестре нет записи) Reg-Free методе и при А где этот манифест лежит, вместе с библиотекой? Надо погуглить тему и вашу ссылку. .... Пока писал появилось ваше последнее сообщение, читаю.
0
|
||
|
Модератор
|
||||
| 02.04.2018, 13:52 | ||||
Для чего экспортировать 50 функций если эти функции уже есть в самом указателе на объект?Если к примеру у нас не свое приложение как VBA, то просто делаем как в секции Using the Activation Context API.
1
|
||||
|
|
||
| 02.04.2018, 14:12 [ТС] | ||
|
Про name.exe.manifest читал, но у меня просто dll (потому собственно и пошел через реестр, не смог придумать как для dll прописать манифест - чтобы без регистрации в реестре). Почитаю инфо по ссылке. Обобщая - для моей задачи подходит больше com, чем процедурная dll (с точки зрения пользователя меньше писать кода на VBA, 1С, com - поддерживающих компиляторов, но видимо не для всех языков - для них пока не понятно насколько com выигрывает). Можно попробовать пойти через манифест, ибо регистрация в реестре пугает народ (видимо). Хотя не ясно чем (можно же ведь и под пользователем регистрировать). Минусы - нет раннего связывания, медленнее скорость обмена с dll (замерял - процентов на 50%), что существенно для быстрых вычислений (для справедливости замечу, что внутри dll скорости не меняются и не зависят от раннего или позднего связывания). The trick, Вы как специалист с большим стажем разработки, что посоветуете добавить/убрать/переделать?
0
|
||
|
Модератор
|
|||||
| 02.04.2018, 14:45 | |||||
|
1
|
|||||
|
|
||
| 02.04.2018, 16:26 [ТС] | ||
|
The trick, вы меня почти убедили что COM- это не плохо, хотя какое-то неприятие этой технологии народом просматривается.
Кстати насколько сложно подключить в Freebasic? (совсем не знаю этот диалект, хочу поделится с другом библиотекой) В гугле видел такую конструкцию для FreeBasic "dhCreateObject («Word.Application», NULL, @wdApp)" Нашел какой-то Disphelper (библа). Видимо можно, надо гуглить.
0
|
||
|
Кормпилятор
|
||
| 03.04.2018, 20:10 | ||
|
Анатолий, я не пользуюсь FASM, слабо понимаю его синтаксис.
Вижу что там манифест уходит в ресурсы(которыми я тоже не пользуюсь), Comninvoke хз чем заменить, тот адрес что в селекторе - хз откуда он его берёт. За пример спасибо, но это опять же без соотв. навыков - х**ова туча времени чтобы разобрать. Например если было бы в MASM без всяких locals, struc, cominvoke и т.п. тогда было бы примерно ясно что там в деталях происходит. FASM всё прячет очень жёстко, уже обращал на это внимание, мне крайне не импонирует этот подход, после книги Пирогова. У меня просто сейчас не все исходники под рукой и кучу всего забыто. Думаю нужно плясать от соответствующих WinAPI и понять как структуры описать, чтобы FB всё это сожрал. это и дерьмовейший подход к программированию. Это не совсем то, там заточка под офисные приложения. Лезть под капот не очень хочется, слишком дофига кода лопатить. Добавлено через 1 час 11 минут bedvit, короче попробую пошуршать всё это, если получится завести библиотеку Анатолия с FB, тогда уже будем смотреть по вашей библиотеке.
0
|
||
|
Кормпилятор
|
||
| 03.04.2018, 23:02 | ||
|
Мне проще например понять MOV ECX, бла бла бла CALL CS:[ECX] тут сразу видно что процедура находится по смещению ECX, чем какие-то там ссылки, по указателям, куда-то там фиг знает куда. К тому же что за формат строки BSTR? Я макросы эти не рублю совсем. Также GetTypeInfoCount GetTypeInfo GetIDsOfNames Если прототипы QueryInterface, AddRef, Release я худо бедно нашёл в хедерах винды, то где мне искать эти прототипы? Я просто пытаюсь понять всё это на самом низком уровне. Частично сейчас смотрю разные исходники и бошка взрывается просто. Это ужас какой-то. Объект и Виртуальная таблица как они впамяти организованы, да хрен его знает, нигде нету информации. Хедеры все в формате си++ с кучей деректив, который тоже не рублю. Чую с нахрапу не получится, это реально надо рубить во всём этом. Добавлено через 18 минут Вопросов дофига: Без манифеста эта штука будет работать? Т.е. если уже запускалась usage.exe. Что происходит в invoke CoCreateInstance, CLSDID_CTest, 0, CLSCTX_INPROC_SERVER, IID__CTest, addr cObject Т.е. CLSDID_CTest и IID__CTest - это указатели. addr cObject - это указатель на какую структуру? cObject в памяти как организован? Мне же просто нужен указатель на функцию, чтобы мог передать ей управление. Или это всё работает по другому?
0
|
||
|
Модератор
|
||||||||||
| 03.04.2018, 23:04 | ||||||||||
0
|
||||||||||
| 03.04.2018, 23:04 | |
|
Как подключить .dll библиотеку? Не могу подключить dll библиотеку Как подключить библиотеку 7z.dll? Как подключить библиотеку i7000.dll? Как подключить библиотеку shell32.dll ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|