Boost logo

Boost Users :

Subject: Re: [Boost-users] Serializing derived class in dll
From: Christian Bergstrand (christian_at_[hidden])
Date: 2009-06-13 05:11:20


"decl" for what?

I should have written that I am using a .def file to get getobj out of
the dll, to add some more missing information, I am running MSVC 2005 on
Win XP. The sample is a compileable and runnable solution

Where can I find a introduction to running the tests? I have spent 2
hours trying to get the test cases to run.

Christian

Robert Ramey skrev:
> Shouldn't there be some "decl" statements in here?
>
> There is a test in the package test_dll_exported...
>
> Perhaps you might check to see that that test works with your setup.
>
> I'm now in the process of adding tests for this functionality
> for version 1.40 . Can't promise I'll make the deadline though.
>
> Robert Ramey
>
> Christian Bergstrand wrote:
>
>> I am working on a programwith pluggable classes delivered in DLLs, so
>> I have an virtual abstract base class in my EXE and both abstract and
>> concrete classes in a hiearchy in my first DLL. I am trying ot
>> serialize the derived class instances through a base class pointer. I
>> am not able to get it to work after reading the samples in the
>> documentation and
>> the most likely looking threads here.
>>
>> So I broke it down in to a sample EXE/DLL and can still not get it to
>> work.
>> I am using version 1_38 currently, also tried with 1_36_0
>>
>> I am getting the exeption on oserializer.hpp:374 where the comment
>> says // note:if this exception is thrown, be sure that
>> derived pointer
>> // is either registered or exported.
>>
>> In my opinion I am exporting my derived class, but I am feeling that
>> it is probably going into the wrong instance, since the export code is
>> going into the DLL, but I can not find any other recomendation.
>>
>> So what am I missing ...
>>
>> ------------------------
>> serializedll\base.h
>> ------------------------
>> #pragma once
>>
>> class Base
>> {
>> public:
>> virtual void f() = 0;
>> private:
>> friend class boost::serialization::access;
>> template<class Archive>
>> void serialize(Archive & ar, const unsigned int version)
>> {
>> }
>> };
>> BOOST_SERIALIZATION_ASSUME_ABSTRACT( Base )
>>
>> ------------------------
>> serializedll\serializedll.cpp, in the EXE
>> ------------------------
>> #include <tchar.h>
>> #include <windows.h>
>>
>> #include <fstream>
>>
>> #include <boost/archive/text_oarchive.hpp>
>> #include <boost/serialization/nvp.hpp>
>>
>> #include "base.h"
>>
>>
>> int _tmain(int argc, _TCHAR* argv[])
>> {
>> typedef Base * ( GetObjFun )();
>> GetObjFun * f = (GetObjFun*)GetProcAddress( LoadLibrary( TEXT(
>> "plugin.dll" ) ), "getobj" );
>> Base * obj = f();
>>
>> std::ofstream ofs( "c:\\test.xml" );
>> boost::archive::text_oarchive oa(ofs);
>>
>> oa << obj;
>>
>> return 0;
>> }
>>
>>
>> ------------------------
>> plugin\plugin.cpp, in the DLL
>> ------------------------
>> #include <windows.h>
>>
>> #include <boost/serialization/export.hpp>
>> #include <boost/archive/text_oarchive.hpp>
>>
>> #include "../serializedll/base.h"
>>
>> BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,
>> LPVOID lpReserved )
>> {
>> return TRUE;
>> }
>>
>> class Derived : public Base
>> {
>> public:
>> virtual void f()
>> {
>> }
>> private:
>> friend class boost::serialization::access;
>> template<class Archive>
>> void serialize(Archive & ar, const unsigned int version)
>> {
>> ar & boost::serialization::base_object< Base >( *this );
>> }
>> };
>>
>> BOOST_CLASS_EXPORT( Derived )
>>
>> Base * getobj()
>> {
>> return new Derived();
>> }
>>
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
>


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