1 | |
Подключить библиотеку dll01.03.2017, 09:35. Показов 8022. Ответов 166
Метки нет (Все метки)
Данным диалектом Бейсика не пользуясь, но иногда здесь бываю. Решил немного поучаствовать. Собственно вопрос в следующем: можно ли пользоватся сторонними библиотеками в этом диалекте, насколько сложен процесс использования? Цель - есть своя xll для VBA, можно убрать обертку будет dll, выложу здесь для тех кто много считает, большими числами) (Гугл не спрашивал ибо важно понять, есть целесообразность в данном продукте?)
0
|
01.03.2017, 09:35 | |
Ответы с готовыми решениями:
166
Не получается подключить библиотеку Unmanaged.dll (Firefox nss3.dll) Подключить библиотеку dll Как подключить dll библиотеку? Как подключить .dll библиотеку? |
03.04.2018, 23:13 | 81 |
Там не написано как это в памяти организовано.
Я худо бедно скодил CoCreateInstance, и не понимаю что такое cObject, он ничего не заполняет, я ему даю структуру из ANY PTR, равную кол-ву функций в библиотеке, после вызова там одни нули. Нету адресов функций, как мне их добыть? У тебя в программе на асме нет QueryInterface и всё работает.
0
|
Модератор
|
|
03.04.2018, 23:21 | 82 |
Будет, но в этом случае нужно регистрировать DLL. (regsvr32)
Создание объекта CTest и возвращение указателя на интерфейс _CTest в параметр cObject. Да это указатели на две структуры GUID, одна с идентификатором класса, другая с идентификатором интерфейса. В COM ты получаешь не указатель на функцию, а указатель на таблицу функций (множество функций). Чтобы получить указатель на функцию, нужно ведь знать на какую. Как это определить? Обычно в DLL это делается по имени или ординалу, в COM мы получаем не функцию а список функций. Этот список всегда фиксированный и идентифицируется через GUID (IID - interface identifier). К примеру IID интерфейса _CTest равен {D83F0A2C-3940-4237-B88E-7097479D01C6}. Если ты создашь любой другой объект из любой другой DLL что поддерживает этот интерфейс ты всегда получишь указатель на список функций следующего вида: QueryInterface AddRef Release GetTypeInfoCount GetTypeInfo GetIDsOfNames Invoke ShowMsgBox CLSID - однозначно определяет реализацию. К примеру в классическом варианте это как просто путь к DLL, но к примеру тут возникает проблема что одна DLL может иметь только одну экспортируемую функцию одного имени. В COM же GUID (CLSID - class identifier) однозначно определяет реализацию. Одна DLL может содержать множество объектов с разными CLSID и никаких проблем не возникнет. IID - определяет интерфейс, CLSID - определяет реализацию. Это все очень упрощенно. Добавлено через 5 минут Как же? Если бы гипотетически я бы реализовал в классе CTest какой-либо еще интерфейс, то я бы мог его запросить в коде через QueryInterface.
0
|
04.04.2018, 05:27 | 83 | ||||||||||||||||||||||||||||||||||||||||
Да это понимаю. Просто пытаюсь понять что мне вернёт WinAPI функция CoCreateInstance
в место памяти указанное в последнем параметре. Короче выяснил что Hresult равен 0x80040154, а это ошибка "класс не зарегистрирован". Попробую зарегистрировать. Видать нули вылезали из аз этого, а я сижу бошку ломаю как идиот))) Добавлено через 1 минуту Жесть какая. Уже мозг в трубочку скручивается. Лан попробуем. Добавлено через 5 часов 48 минут Короче ничего у меня не выходит. Подключаю хедеры:
находится по адресу смещения IFace. Если я всё правильно понял. Наваливаем асма:
Делал по этому ману с другого форума:
Ещё немного помучаюсь и наверное тупо забью на это, потому что пустая трата времени, сейчас реально не до изучения тонн литературы. Куда я вообще полез, в какие-то адские дебри.
0
|
04.04.2018, 07:36 | 84 | ||||||||||
Quiet Snow, возьму на себя смелость показать, как это делается на PureBasic.
На примере Windows Media Player Запускаю OLE/COM Interface generator, он ищет все OLE/COM интерфейсы в системе, или могу указать на конкретный файл dll, если не зарегистрирован в системе. Ищу Media Player и генерирую код.
Я всё ненужное мне выбросил, оставил только тот интерфейс, с которым буду работать, а именно IMediaPlayer2 Теперь конкретно то, что я пишу руками это ниже:
Т.е. для другого контрола поменяется ProgID ("MediaPlayer.MediaPlayer.1" ) и указатель на интерфейс *mp.IMediaPlayer2 Естественно логику программы разумеется тоже самому. В результате всё работает: Это музыка, но видео тоже показывает.
1
|
Модератор
|
|
04.04.2018, 08:32 | 85 |
Quiet Snow, скинь пожалуйста exe я не сильно разбираюсь в синтаксисе fb. На первый взгляд у тебя 2 ошибки. Ты передаешь указатель на префиксную длину строки а нужно на саму строку. Вторая ошибкаэто то что ты передаешь BSTR а нужно *BSTR :
LEA ECX, Sa
0
|
04.04.2018, 13:07 [ТС] | 86 | ||||||||||
Будут вопросы, обращайтесь, помогу чем смогу, ибо последние посты для меня, как хорошая книга - интересно и покрыто тайной.
Если это про мой продукт, выложу здесь код .idl файла (может поможет для понимания процесса):
Кликните здесь для просмотра всего текста
Библа подключается по uuid(77d79ca3-15a0-4310-b8d8-0bcbe3f72d96). В реестр пишу: Кликните здесь для просмотра всего текста
По-моему к свойствам и методам можно еще обращаться и по id(). В реализации интерфейса (см.выше) можно посмотреть id() для каждого свойства или метода.
0
|
04.04.2018, 15:08 | 87 |
См. вложение.
Оператор SADD получает смещение(адрес) начала памяти строки. В начале строки я выделил 4 байта(2 пробела) и забил в них(в этот INTEGER) длину т.е значение 6. Вроде бы всё по стандарту, в любом случае прога бы хоть что-то вывела до нуля. Load Effective Adress (LEA) не помог.
0
|
Модератор
|
|||||||||||
04.04.2018, 20:13 | 88 | ||||||||||
Посмотрел. 3 ошибки
1. Как я говорил ты передаешь указатель на префикс (6), а нужно на строку. Либо сделать типа того:
2. Лишнее перенаправление. Вместо указателя на интерфейс ты передаешь указатель уже на метод, а вместо вызова метода по указателю вызываешь по значению первых инструкций самого метода. 3. Вместо указателя на BSTR, передается BSTR. 2 и 3 решается изменением ассемблерного кода:
0
|
04.04.2018, 23:06 | 93 |
Манифест и dll взял из архива Подключить библиотеку dll
Регистрировал dll (успешно) но это не устраняло ошибку.
0
|
Модератор
|
|
04.04.2018, 23:08 | 94 |
locm, какая система? Без манифеста работает? У Quiet Snow все заработало.
Код создания мой? Или какой-то свой? Dll в папке (если используется манифест) с программой? Название как в манифесте? Если код другой, то лучше скинуть архив с файлами тогда уже видно будет.
0
|
05.04.2018, 00:02 | 97 |
С ошибкой разобрался. Дело было в том что запускал под управлением отладчика и исполняемый файл создавался во временной папке.
Теперь другая проблема. Программа вылетает при вызове метода ShowMsgBox с сообщением "Невозможен доступ к памяти. Ошибка чтения по такому-то адресу". Методу передается BSTR строка.
0
|
05.04.2018, 07:32 | 99 | ||||||||||
OLE/COM Interface generator выдает, что там должен быть указатель
И GUIDs не совпадает у меня, вернее один совпадает.
0
|
05.04.2018, 10:10 | 100 | |||||
Он и передается.
Он вообще типы переменных не определяет. PB по умолчанию передает строки по указателю. Интерфейс аналогичен. Просто часть методов наследуется от IUnknown.
0
|
05.04.2018, 10:10 | |
05.04.2018, 10:10 | |
Помогаю со студенческими работами здесь
100
Не могу подключить dll библиотеку Как подключить библиотеку 7z.dll? Как подключить библиотеку i7000.dll? Как подключить библиотеку shell32.dll ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |