Boost logo

Boost Users :

From: Arjuna Balasingham (abalasingham_at_[hidden])
Date: 2006-06-13 14:00:19


Re: unregistered_class exceptions are thrown when the derived class are in
an explicitly loaded DLL.

 

Hello,

 

In a nutshell, the problem that I have is that an "unregistered_class"
exception is thrown when the derived class is defined/declared in a DLL that
is explicitly loaded.

The problem as far as I can tell is that the derived class in dll and the
derived class in the framework are being "registered" in two different
instances (m_self->m_map.insert(eti); in "extended_type_info.cpp").

 

Exception is thrown when trying to serialize the foobar_derived_dll. It
looks for "foobar_derived_dll" in the wrong instance of the m_map defined in
the extened_type_info.cpp and then throws an exception.

 

Can anybody please help

 

The Application Structure is more or less as follows.

 

Common Framework Library Contains.

class foobar_base : public foobar_base

{

protected:

      bool m_attr0;

 

public:

      foobar_base() {}

      template<class Archive>

      void serialize(Archive & ar, const unsigned int /* file_version */){

            std::cout << "serialize foobar_base\n";

            ar & BOOST_SERIALIZATION_NVP(m_attr0);

}

}

 

class foobar_derived : public foobar_base

{

protected:

      bool m_attr1;

 

public:

      foobar_derived() {}

      template<class Archive>

      void serialize(Archive & ar, const unsigned int /* file_version */){

            std::cout << "serialize foobar_derived_dll\n";

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(foobar_base);

            ar & BOOST_SERIALIZATION_NVP(m_attr1);

}

}

BOOST_CLASS_EXPORT_GUID(foobar_derived, "foobar_derived")

 

 

 

Dynamic Link Library Contains (Includes Common Framework Library)

class foobar_derived_dll

{

protected:

      bool m_attr2;

 

public:

      foobar_derived_dll() {}

      template<class Archive>

      void serialize(Archive & ar, const unsigned int /* file_version */){

            std::cout << "serialize foobar_derived_dll\n";

ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(foobar_base);

            ar & BOOST_SERIALIZATION_NVP(m_attr2);

}

}

BOOST_CLASS_EXPORT_GUID(foobar_derived_dll, "foobar_derived_dll")

 

 

 

 

Main Application (includes Common framework library & explictly lods Dynamic
Link Library)

class foo {

public:

      std::list<boost::shared_ptr<foobar_base> > m_foovec;

 

public:

      foo ( ) { };

      ~foo ( ) { };

 

      template<class Archive>

      void serialize(Archive &ar, const unsigned int version)

      {

            ar & BOOST_SERIALIZATION_NVP(m_foovec);

      }

};

 

 

(..Include Framwork..)

int main() {

 

      // load the DLL..

      LoadLibrary(... DLL)"

      

      foo f;

f.m_foovec.push_back( boost::shared_ptr<foobar_base>(new foobar_derived(....

f.m_foovec.push_back( boost::shared_ptr<foobar_base>(new
foobar_derived_dll(....

 

      std::string filename("c:\\tmp.txt");

      try {

            // write to file

            std::ofstream ofs(filename.c_str());

            assert(ofs.good());

            boost::archive::text_oarchive oa(ofs);

 

            oa << BOOST_SERIALIZATION_NVP(f);

            ofs.close();

      } catch (std::exception &e) {

            std::cout << e.what() << std::endl;

      }

}

 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net