Da quel che ho capito stai facendo proprio il contrario di quello che dovresti fare. E' la DLL che deve contenere il codice che devi condividere, non l'applicativo; per cui sarà la DLL ad avere il codice di Factory e di tutte le classi che ti servono per l'applicazione, non il contrario.
Il codice sotto è un esempio. L'unica cosa che conoscerà la tua applicazione saranno le varie interfacce raccolte in uno o più file .h più una unica funzione di caricamento della Factory vera e propria.
codice:#pragma once // #include "BeamDsChess.h" // #include <map> class CBeamDSChess; // classe interfaccia. class Factory1 { public: virtual CBeamDSChess * CreateDS( int idOfObjectToCreate )=0; }; extern "C" { void __declspec(dllexport) Factory1* FactoryDS(); } //////////////////////////////////////////////////////////////////////////////// // Factory1.cpp //////////////////////////////////////////////////////////////////////////////// typedef CBeamDSChess* (*BASE_CREATE_FN)(); class CBeamDSChess_type1 : public CBeamDSChess { public: static CBeamDSChess* instance() { return new CBeamDSChess_type1; } /* funzioni virtuali di CBeamDSChess */ /* virtual */ void release() { delete this; } }; class CBeamDSChess_type2 : public CBeamDSChess { public: static CBeamDSChess* instance() { return new CBeamDSChess_type2; } /* funzioni virtuali di CBeamDSChess */ /* virtual */ void release() { delete this; } }; class CBeamDSChess_type3 : public CBeamDSChess { public: static CBeamDSChess* instance() { return new CBeamDSChess_type3; } /* funzioni virtuali di CBeamDSChess */ /* virtual */ void release() { delete this; } }; class Factory1Impl : public Factory1 { public: Factory1Impl(void) {} ~Factory1Impl(void) {} static bool InizializedMap; static Factory1Impl* instance_ptr ; static Factory1Impl* get_instance() { if (instance_ptr == NULL) { instance_ptr = new Factory1(); } return instance_ptr; } /* virtual */ CBeamDSChess * CreateDS( int idOfObjectToCreate ); std::map<int, BASE_CREATE_FN> m_pMapRegister; }; Factory1Impl* Factory1Impl::instance_ptr; bool Factory1Impl::InizializedMap(false); //----------------------------------------------------------------------------- CBeamDSChess* Factory1Impl*::CreateDS( int idOfObjectToCreate ) { /* Nessuna eccezione deve uscire dalla funzione */ try { BASE_CREATE_FN fz = m_pMapRegister[idOfObjectToCreate]; return fz(); } catch ( const std::exception& ) { } return 0; } extern "C" { void __declspec(dllexport) Factory1* FactoryDS() { /* Nessuna eccezione deve uscire dalla funzione */ try { Factory1Impl::get_instance(); if ( InizializedMap == false) { m_pMapRegister.insert(std::make_pair(tipo1,&CBeamDSChess_type1::instance)); m_pMapRegister.insert(std::make_pair(tipo2,&CBeamDSChess_type2::instance)); m_pMapRegister.insert(std::make_pair(tipo3,&CBeamDSChess_type3::instance)); InizializedMap = true; } return Factory1Impl::instance_ptr; } catch (const std::exception& ) { } return 0; } } // ~extern "C" //////////////////////////////////////////////////////////////////////////////// // Applicativo che usa le classi della DLL //////////////////////////////////////////////////////////////////////////////// // Creo factory Factory1* chessFactory = FactoryDS(); // istanza singleton della factory. if ( NULL == chessFactory ) throw std::bad_alloc("No Factory1"); // Creo i pezzi. CBeamDSChess* type1 = chessFactory->CreateDS(tipo1); if ( NULL == type1 ) throw std::bad_alloc("No Factory1"); CBeamDSChess* type2 = chessFactory->CreateDS(tipo2); if ( NULL == type2 ) throw std::bad_alloc("No Factory1"); CBeamDSChess* type3 = chessFactory->CreateDS(tipo3); if ( NULL == type3 ) throw std::bad_alloc("No Factory1"); // uso i pezzi type1->qualcosa(); type2->qualcosa(); type3->qualcosa(); // rilascio la memoria usando l'apposito metodo. ASSOLUTAMENTE NO DELETE!!! type1->release(); type2->release(); type3->release();

Rispondi quotando