
Thoroughly embarrassed to say I forgot to flush! Thanks, Jeff "Jeff Flinn" <TriumphSprint2000@hotmail.com> wrote in message news:dcnsln$c3o$1@sea.gmane.org...
I've spent the last several hours trying to update my project with 1.33.0.RC. The only changes were naming issues with iostreams, and the getting rid of the lovely :) asserts on serialization inclusions previous to archive inclusions. Also an issue with operator << and const_cast-ing appears below, and switching to the standard BOOST_SHARED_POINTER_EXPORT_GUID macro which now appears to handle pointers in namespaces properly. All compiles and links succesfully under VC7.1.
Rudimentary xml serialization seems to save/load succesfully. I am having an problems when using iostreams/serialization together to support copy/paste/drag/drop under Windows MFC. Which all worked flawlessly using 1.32.0 along with pre-release iostreams.
I'd appreciate it if anyone sees anything blatantly wrong with the code below. CSharedFileSink::write is not being called at all. This leads and assert in MFC's CSharedFile::Detach because the file has never been written to. The member CSafeDataSource::GlobalArchiveHdl instantiates a CSharedFileOStream and attempts to serialize it's mVal data member to a binary archive.
Thanks in advance, Jeff
namespace adi { namespace mfc { namespace clipboard {
struct CSharedFileSink : public boost::iostreams::sink { CSharedFile& mSharedFile;
CSharedFileSink( CSharedFile& aSharedFile ) : boost::iostreams::sink() , mSharedFile(aSharedFile) {}
std::streamsize write( const char* s, std::streamsize n ) { mSharedFile.Write( s, n ); return n; } };
class CSharedFileOStream : private boost::base_from_member<CSharedFile> , public boost::iostreams::stream<CSharedFileSink> { typedef boost:: base_from_member<CSharedFile > tSharedFile; typedef boost::iostreams::stream<CSharedFileSink> tBase;
public: CSharedFileOStream() : tSharedFile( GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT ) , tBase( CSharedFileSink( tSharedFile::member ) ) {}
HGLOBAL Detach(){ return tSharedFile::member.Detach(); } };
template< class T > class CSafeDataSource : public COleDataSource { typedef T value_type;
value_type mVal;
HGLOBAL GlobalArchiveHdl() { CSharedFileOStream lOut;
boost::archive::binary_oarchive oa( lOut );
// oa & mVal; // same result as below
oa << const_cast<const value_type&>(mVal); //BOOST_1_33_0
return lOut.Detach(); }
CSafeDataSource( const T& aVal ) : COleDataSource(),mVal(aVal){ DelayRenderData( NativeFormat() ); }
friend void ToClipBoard<T>( const T& aVal ); friend void Drag<T>( const T& aVal , tDragImagePtr aDragImagePtr , DWORD aDropEffect );
public:
static CLIPFORMAT NativeFormat(){ return RegisteredClipboardFormat<value_type>(); }
virtual BOOL OnRenderGlobalData( LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal ) { if( lpFormatEtc->cfFormat == NativeFormat() ) { return (*phGlobal = GlobalArchiveHdl())? TRUE : FALSE; } return FALSE; } };
} } }
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost