powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование класса из динамически загруженной библиотеки (LoadLibrary)
20 сообщений из 20, страница 1 из 1
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39027994
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Есть внешние компоненты, которые распространяются в виде dll и пары .h.
В одном из хедеров описание класса, в другом функции для С.
Dll экспортирует функцию создания класса.
Делаю LoadLibrary, GetProcAddress с названием функции создания класса.
Получаю функцию, вызываю, возвращает что-то.
Пытаюсь вызвать метод класса у этого чего-то и случается странное...
по логу этой библиотеки как будто бы вызывается не тот метод который мне надо, а другой(или вообще с середины).
В чем может быть проблема?

лишнее опустил.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include "iobj.h"
...
typedef IObj*(create_fn)(int);
...
auto lib=LoadLibrary('dll.dll');
auto fn=reinterpret_cast<create_fn*>(GetProcAddress(lib,"CreateObj"));
auto obj=fn(1);
obj->method1();
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39027997
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотек собрана mingw, у меня студия 2013.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028009
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или без линкования lib (которой нет) так не прокатит?
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028024
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikanokВ чем может быть проблема?
Неправильное объявление класса в заголовке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028050
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее там объявлен "интерфейс".

а что может быть не так?

ну и функции для С без lib тоже не получится использовать, т.к. при линковке спросит "где" ?
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028056
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одном из хедеров описание класса, в другом функции для С.


Именно для C , или всё же для С++?


В чем может быть проблема?


Ну на самом деле проблема может быть в чём угодно, там на каждом этапе может быть много проблем разных.

Я бы пока рекомендовал, если есть возможность, линковать .dll статически, через библиотеку импорта.
Так по крайней мере линкер всё проверит, и если будут проблемы, сообщит.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikanokну и функции для С без lib тоже не получится использовать, т.к. при
линковке спросит "где" ?
Не спросит. Линкер GCC достаточно умён чтобы линковать прямо с DLL. Для MSVC штатная
утилита implib создаст lib из def для любой dll.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028066
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Именно для C , или всё же для С++?
extern "C" {
...
SHARED_EXPORT int SHARED_CCA Check(void *ptr);
...
}

MasterZiv Я бы пока рекомендовал, если есть возможность, линковать .dll статически, через библиотеку импорта.
Так по крайней мере линкер всё проверит, и если будут проблемы, сообщит.
Проблема в том что единственное что у меня есть это dll, пара .h и .exe (тестовая прога, с ней все ок).
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028085
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovchikanokну и функции для С без lib тоже не получится использовать, т.к. при
линковке спросит "где" ?
Не спросит. Линкер GCC достаточно умён чтобы линковать прямо с DLL. Для MSVC штатная
утилита implib создаст lib из def для любой dll.


В общем, ты прав, но implib нет в MSVC. Есть dumpbin и link, один делает .def файл, другой из него может сделать .lib.
implib есть только в дельфях/билдерах.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028086
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе спросит. Линкер GCC достаточно умён чтобы линковать прямо с DLL.


Дело в том, что не с каждой .dll можно слинковаться в принципе.
Не во всех .dll есть символьные названия функций.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028094
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDimitry SibiryakovНе спросит. Линкер GCC достаточно умён чтобы линковать прямо с DLL.


Дело в том, что не с каждой .dll можно слинковаться в принципе.
Не во всех .dll есть символьные названия функций.
ээээ... ты такие заявления режь лучше на два отдельных поста и с объяснениями.

Не всегда файл с расширением .dll является Dinamic Load Library. Это может быть все что угодно на самом деле.
Существуют несколько форматов DLL (например в современных виндах есть Win32, .Net, и dll+manifest). Все три вида требуют "слегка" разных подходов.


DLL (Win32-style) действительно может не иметь символьных названий для экспортируемых точек входа, но они всегда будут иметь какой-то номер и соответственно: даже если нету символьных имен, можно линковать по номеру.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028182
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikanokПроблема в том что единственное что у меня есть это dll, пара .h и .exe (тестовая прога, с ней все ок).

Ну на самом деле, как я уже устал всем повторять, если у тебя есть только .dll, то в общем случае слинковаться с ней невозможно.
Нужно обязательно иметь .lib.

Ну и странно, что .h у тебя есть, а .lib нету. Где ты их брал? Может там и .lib дадут ?
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39028184
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlMasterZivпропущено...


Дело в том, что не с каждой .dll можно слинковаться в принципе.
Не во всех .dll есть символьные названия функций.
ээээ... ты такие заявления режь лучше на два отдельных поста и с объяснениями.

Не всегда файл с расширением .dll является Dinamic Load Library. Это может быть все что угодно на самом деле.



Согласен. И наоборот, библиотеки динамической компановки могут иметь другие расширения, не обязательно .dll.
Намример, .vcl или даже .exe.

White OwlСуществуют несколько форматов DLL (например в современных виндах есть Win32, .Net, и dll+manifest). Все три вида требуют "слегка" разных подходов.

DLL (Win32-style) действительно может не иметь символьных названий для экспортируемых точек входа, но они всегда будут иметь какой-то номер и соответственно: даже если нету символьных имен, можно линковать по номеру.

Можно, но в программе на C ты функции по номеру не будешь вызывать.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029127
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо!!!

Для студии сделал lib с помощью dumpbin и lib.
Под линукс так слинковалось (был еще so файл).

С линуксом опыта почти нет.
Насколько понял положить либу рядом не достаточно ?
Для тестов добавил в переменную окружения (export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib/dir ).
А как надо по уму "устанавливать" библиотеку?
Программка является расширением для ноды. Их вроде при установке не принято никуда перекладывать, где собрали там и используют. Либу хотелось бы тоже держать рядом и может быть даже в нескольких местах (например разные версии расширения).
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029291
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikanokА как надо по уму "устанавливать" библиотеку?
Саму библиотеку или ссылку на неё закинуть в /usr/lib или /usr/lib64 в соответствии с
разрядностью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029420
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chikanokС линуксом опыта почти нет.
Насколько понял положить либу рядом не достаточно ?
Для тестов добавил в переменную окружения (export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib/dir ).
А как надо по уму "устанавливать" библиотеку?


В принципе, так и устанавливать, положить в один из каталогов, понимаемых ld
По большому счёту,

Код: plaintext
man 8 ldconfig
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029670
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivесли у тебя есть только .dll, то в общем случае слинковаться с ней невозможно.
Нужно обязательно иметь .libВполне достаточно документации и штатных утилит для получения списка экспортов.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029777
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovMasterZivесли у тебя есть только .dll, то в общем случае слинковаться с ней невозможно.
Нужно обязательно иметь .libВполне достаточно документации и штатных утилит для получения списка экспортов.

Ребята, ещё раз повторяю, в 125 раз.
Не во всех .dll есть точки экспорта в виде символьных наименований функций.
Например, в системных библиотеках Windows экспорт идёт по номеру функции, символьных имён там нет.
Имена символов храняться только в библиотеках импорта, сгенерированных для этих .dll во время сборки этих .dll
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029784
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе во всех .dll есть точки экспорта в виде символьных наименований функций.
Например, в системных библиотеках Windows экспорт идёт по номеру функции, символьных имён там нет.Спасибо, Капитан Очевидность.
Только если экспорт идёт исключительно по номерам, то в документации расписано соответствие номеров экспорта именам, которые будут использоваться в тексте программы.
Более того, номера указываются и тогда, когда есть экспорт по именам, т.к. загрузка по номеру делается быстрее.
...
Рейтинг: 0 / 0
Использование класса из динамически загруженной библиотеки (LoadLibrary)
    #39029897
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovMasterZivНе во всех .dll есть точки экспорта в виде символьных наименований функций.
Например, в системных библиотеках Windows экспорт идёт по номеру функции, символьных имён там нет.Спасибо, Капитан Очевидность.
Только если экспорт идёт исключительно по номерам, то в документации расписано соответствие номеров экспорта именам, которые будут использоваться в тексте программы.
Более того, номера указываются и тогда, когда есть экспорт по именам, т.к. загрузка по номеру делается быстрее.

Вовсе не обязательно.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование класса из динамически загруженной библиотеки (LoadLibrary)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]