Я новичок в зерновых, и недавно я столкнулся со странной проблемой:
У меня есть код сериализации внутри внешней DLL, в коде я использую функциональность полиморфизма злаков при попытке вызвать метод archive() то есть в DLL из исполняемого файла, программа вылетает, однако это происходит только в том случае, если метод archive() вызывается из скомпилированного кода (я подозреваю), если он виден вызывающему (вызывается непосредственно основной функцией), то есть никаких сбоев,
также, если я отключу полиморфное использование, сбоя не будет,
также, если я изменю DLL на статическую библиотеку, сбоя не будет.
сбой вызван UNREGISTERED_POLYMORPHIC_EXCEPTION. он указывает, что мне нужно зарегистрировать полиморфный тип, и, похоже, он отсутствует в карте привязки, хотя я регистрирую его заранее.
Я разработал небольшой пример, чтобы продемонстрировать проблему:Я использую Windows 10 MSVC 2022
cereal v1.3.2
Во внешней DLL
Архиватор.hpp
#pragma once
#include
#include
#include
#include
#include
#include "myclasses.hpp"
class __declspec(dllexport) Archiver
{
public:
void add(std::shared_ptr cls)
{
classes.push_back(cls);
}
void save()
{
std::ofstream os("polymorphism_test.xml");
cereal::XMLOutputArchive oarchive(os);
oarchive(classes);
}
void load()
{
{
std::ifstream is("polymorphism_test.xml");
cereal::XMLInputArchive iarchive(is);
std::vector ptrs;
iarchive(ptrs);
//ptrs[0]->sayType();
ptrs[0]->sayType();
}
}
std::vector classes;
};
IndirectCaller.hpp
#pragma once
struct BaseClass;
#include
class __declspec(dllexport) indirectCaller
{
public:
void call(std::shared_ptr cls);
};
IndirectCaller.cpp
#include "indirectCaller.hpp"
#include "archiver.hpp"
void indirectCaller::call(std::shared_ptr cls)
{
Archiver a;
a.add(cls);
a.save();
a.load();
}
myclasses.hpp
#pragma once
// Include the polymorphic serialization and registration mechanisms
#include
// A pure virtual base class
struct BaseClass
{
virtual void sayType() = 0;
};
В исполняемом файле
NewDerived.hpp
#pragma once
// Include the polymorphic serialization and registration mechanisms
#include
#include "myclasses.hpp"
// A class derived from BaseClass
struct DerivedClassThree : public BaseClass
{
void sayType()
{
std::cout
Подробнее здесь: https://stackoverflow.com/questions/787 ... ot-to-work
Архив Cereal, вызываемый из DLL, приводит к тому, что полиморфизм не работает ⇐ C++
Программы на C++. Форум разработчиков
1720471578
Anonymous
Я новичок в зерновых, и недавно я столкнулся со странной проблемой:
У меня есть код сериализации внутри внешней DLL, в коде я использую функциональность полиморфизма злаков при попытке вызвать метод archive() то есть в DLL из исполняемого файла, программа вылетает, однако это происходит только в том случае, если метод archive() вызывается из скомпилированного кода (я подозреваю), если он виден вызывающему (вызывается непосредственно основной функцией), то есть никаких сбоев,
также, если я отключу полиморфное использование, сбоя не будет,
также, если я изменю DLL на статическую библиотеку, сбоя не будет.
сбой вызван UNREGISTERED_POLYMORPHIC_EXCEPTION. он указывает, что мне нужно зарегистрировать полиморфный тип, и, похоже, он отсутствует в карте привязки, хотя я регистрирую его заранее.
Я разработал небольшой пример, чтобы продемонстрировать проблему:Я использую Windows 10 MSVC 2022
cereal v1.3.2
[b]Во внешней DLL[/b]
Архиватор.hpp
#pragma once
#include
#include
#include
#include
#include
#include "myclasses.hpp"
class __declspec(dllexport) Archiver
{
public:
void add(std::shared_ptr cls)
{
classes.push_back(cls);
}
void save()
{
std::ofstream os("polymorphism_test.xml");
cereal::XMLOutputArchive oarchive(os);
oarchive(classes);
}
void load()
{
{
std::ifstream is("polymorphism_test.xml");
cereal::XMLInputArchive iarchive(is);
std::vector ptrs;
iarchive(ptrs);
//ptrs[0]->sayType();
ptrs[0]->sayType();
}
}
std::vector classes;
};
IndirectCaller.hpp
#pragma once
struct BaseClass;
#include
class __declspec(dllexport) indirectCaller
{
public:
void call(std::shared_ptr cls);
};
IndirectCaller.cpp
#include "indirectCaller.hpp"
#include "archiver.hpp"
void indirectCaller::call(std::shared_ptr cls)
{
Archiver a;
a.add(cls);
a.save();
a.load();
}
myclasses.hpp
#pragma once
// Include the polymorphic serialization and registration mechanisms
#include
// A pure virtual base class
struct BaseClass
{
virtual void sayType() = 0;
};
[b]В исполняемом файле[/b]
NewDerived.hpp
#pragma once
// Include the polymorphic serialization and registration mechanisms
#include
#include "myclasses.hpp"
// A class derived from BaseClass
struct DerivedClassThree : public BaseClass
{
void sayType()
{
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78722803/cereal-archive-called-from-dll-cause-polymorphism-not-to-work[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия