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