Архив Cereal, вызываемый из DLL, приводит к тому, что полиморфизм не работаетC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Архив Cereal, вызываемый из DLL, приводит к тому, что полиморфизм не работает

Сообщение Anonymous »

Я новичок в зерновых, и недавно я столкнулся со странной проблемой:
У меня есть код сериализации внутри внешней 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»