@communistic_sistema
Биохимик, но в программировании немного шарю

Как экспортировать экземпляр класса из DLL при LoadLibrary?

У меня в dll есть запись типа
inline instance* i = new instance(some_args);
inline std::vector<struct_with_instance_prt>* v = new std::vector<struct_with_instance_prt>{ {some_args, i} };
extern "C" __declspec(dllexport) std::vector<struct_with_instance_prt>* getvector() { return v; }

Структура instance имеет виртуальную функцию, что она реализует от абстрактной структуры (коя находится также и в приложении что импортирует).
При LoadLibrary все импортируется благополучно, кроме виртуальных функций. Но если я буду экспортировать не вектор структур с указателем на экземпляр как поле, а вектор указателей на экземпляр, то вызов виртуальной функции происходит верно.
Контекст выполнения - dll может загружаться несколько раз в 1 процесс без предварительного высвобождения.
Почему так происходит?
Как следует экспортировать экземпляры структур, если обращение к ним идет только по указателям (то есть получаем указатель, а далее работаем по типу i->f())?
Везде нахожу ответы для примитивов и для __declspec(dllexport) + __declspec(dllimport), а для экземпляров нет. Сектор данных dll где обычно лежат примитивы тоже не помог.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я вижу проблему в определении класса module::module. Ты хранишь экземпляры этого класса в векторе, но у него нет конструкторов копирования и операторов присваивания. А это значит, что созданный здесь временный объект module::module будет там же и разрушен с вызовом FreeLibrary и потерей актуальности всех статических указателей в модуле который был загружен. Среди которых будут указатели на таблицы виртуальных функций для классов определённых в этом модуле.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Передать указатель на экземпляр класса. Допустим в DLL при импортировании через какой ни будь интерфейс вызова .

.h/.cpp
extern "C" __declspec(dllexport) AClass * GetExemplarOfAClass();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы