![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Iron Bug |
![]() ![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Можно ли такое реализовать?
Допустим, есть примерно такой код (собираю под под MinGW): В основном модуле:
В загружаемой динамической библиотеке:
Идея в том, чтобы в основном модуле был базовый класс Base со всеми причиндалами (туда же компилится и его код). А в подгружаемых через LoadLibrary (и заранее неизвестных) библиотеках - дополнительные классы-наследники Derived , которые бы вызывали конструкторы/деструкторы базового класса, а сами были бы экспортируемыми, чтобы основной модуль мог их загружать и использовать. Копаю-копаю, и вот ну никак! При такой реализации вроде бы должно работать, но линкер при сборке dll (__DLL при этом определён) вопит, что декорированное имя импорта конструктора базового класса не определено. Вообще, теоретически, все базовые классы экспортируемого класса тоже должны быть экспортируемыми. Ну, я пыталась добавить в Base ещё и dllexport, но не проканало. То ли неправильно добавляла, то ли это вообще компилятор не жрёт. Он не ругается на такой двойной import-export, но и ошибка не исчезает. Сообщение отредактировал Iron Bug - 14.2.2011, 9:57 |
|
|
![]() |
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
в общем, ковыряла-ковыряла и решила-таки эту задачу. правда, чуть окольным путём:
теперь у меня две библиотеки и основной модуль. в библиотеках - базовый класс и класс-наследник. библиотека наследника линкуется динамической связью с библиотекой базового класса. а основной модуль грузит класс-наследник из библиотеки через dlopen (ну или LoadLibrary под вендой). если потомок не реализует метод, то вызывается метод предка, из базовой библиотеки. всё работает и под вендой, и под линём. правда, пришлось кое-где idfef'ы налепить и с флагами линковки всего этого безобразия повозиться, чтобы работало как надо. и пока создание представителя класса сделано через специальные методы, а не подменой указателей в виртуальных таблицах, хотя можно и напрямую класс грузить из библиотеки, если маленько ассемблера добавить. Сообщение отредактировал Iron Bug - 15.2.2011, 20:37 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 27.6.2025, 13:20 |