grazie Shodan.
Ho letto un po l'articolo devo capirlo pero'.
Adesso quello che non capisco è questo :
nell applicazione chiamiamola base(quella che ha un grande numero di include e file)ho un singleton e una volta istanziato se lo richiamo dall' applicazione che crea la dll mi trovo che l'istanza è ancora null.
Quindi noncapisco.
Perchè 2 istanze diverse?
a dire il vero il casino mi sembra un altro:
factory1.cpp
codice:
#include "stdafx.h"
#include "factory1.h"
using namespace std;
Factory1* Factory1::instance_ptr;
Factory1::Factory1(void)
{
}
//
Factory1::~Factory1(void)
{
}
CBeamDSChess* Factory1::CreateDS()
{
return (m_pMapRegister)[0]();
}
factory1.h
codice:
#pragma once
#include "BeamDsChess.h"
#include <map>
typedef CBeamDSChess* (*BASE_CREATE_FN)();
class Factory1
{
public:
Factory1(void);
~Factory1(void);
static Factory1* instance_ptr ;
static Factory1* get_instance() {
if (instance_ptr == NULL) {
instance_ptr = new Factory1();
}
return instance_ptr;
}
CBeamDSChess * CreateDS();
std::map<int, BASE_CREATE_FN> m_pMapRegister;
private:
};
class registerInFactory
{
public:
static CBeamDSChess* createInstance()
{
AfxMessageBox("pippO");
CBeamDSChess * pDsChess = new CBeamDSChess();
return pDsChess;
}
registerInFactory(BASE_CREATE_FN func)
{
Factory1::get_instance()->m_pMapRegister[0] = func;
}
};
nel file che creea la dll includo (e qui mi sembra di aver commesso un errore) il file .h(giusto) e anche il file.cpp(Factory1.cpp sbagliato) perchè altrimenti mi da un errore di linker quando includo solo il .h.
solo che secondo me all inclusione del file .cpp questa istruzione mi resetta l'istanza:
codice:
Factory1* Factory1::instance_ptr = 0;
Come posso condividere l'istanza del singleton tra applicazione base e applicazione che crea la dll?
Nell articolo è spiegata una soluzione a questa problematica?
penso possa essere un problema risolvibile col GetProcAddress per avere la stessa istanza dell'exe nella dll ma non so bene come.
grazie.