ciao.
Ho uno smart pointer CComQIPtr<_cSapModel>.
lo carico con un getter da un altro oggetto com CComQIPtr<_SapObject> m_pSap
cosi:
codice:
Classe Init
{
Init::~Init(){
m_pSapModel.Release();
m_pSap.Release();
}
.
.
.
Init::Create(){
hr = m_pSap.CoCreateInstance(__uuidof(SapObject), NULL, CLSCTX_LOCAL_SERVER);
m_pSapModel = m_pSap->Get_SapModel();
CSapDataLoadIteratorApi* pA= new CSapDataLoadIteratorApi();
CSapStressIteratorApi* pB= new CSapStressIteratorApi();
pA->Initialize(m_pSapModel);
pB->Initialize(m_pSapModel);
}
};
a questo punto passo lo smart pointer a due classi in cui è utilizzato come variabile membro:
codice:
Class CSapDataLoadIteratorApi
{
CSapDataLoadIteratorApi::~CSapDataLoadIteratorApi()
{
if(m_pSapModel)
m_pSapModel.Detach();//probabilmente non serve perchè ho chiamato Release su m_pModel
}
void CSapDataLoadIteratorApi::Initialize(CComQIPtr<_cSapModel> sapModel)
{
m_pSapModel.Attach(sapModel);
}
};
e
Classe CSapStressIteratorApi
{
CSapStressIteratorApi::~CSapStressIteratorApi(void)
{
if(m_pSapModel)
m_pSapModel.Detach();//probabilmente non serve perchè ho chiamato Release su m_pModel
}
void CSapStressIteratorApi::Initialize(CComQIPtr<_cSapModel> sapModel)
{
m_pSapModel.Attach(sapModel);
}
};
a questo punto lo uso dentro le classi CSapDataLoadIteratorApi e CSapDataLoadIteratorApi.
alla fine distruggo l'oggetto com a partire dal distruttore della classe Init(con i release) e alla
fine distruggo i due oggetti CSapDataLoadIteratorApi e CSapDataLoadIteratorApi.
solo che l'applicazione rimane in memoria , l'ho visto col task manager.
come leggere il conteggio del reference counter degli smart pointer,per regolarsi e debuggare ,dato che non si puo chiamare direttamente
la funzione release incapsulata nel CComQIPtr che dovrebbe ritornare questo conteggio
ma è privata e non so se è corretto utilizare il CComQIPtr.
grazie