Problem with ATL/COM
Hello
I use a C# asp.net webbapplication which call different COM object using the
defined COM interface for each concrete C++ class.
So at the bottom I have OpenDS method located in the concrete C++ class
CHandle_DS.
This method is also define at the IHandle_DS COM interface.
Here is the sequence for the code.
1. I create a concrete C++ class from C# asp.net like this
CHande_DS handle_ds = new Handle_DS();
2. I call OpenDS like this
handle_ds.OpenDS();
3. I pass this concrete C++ object into a method called InitRules2 which is
defined in the COM interface ISyntaxObj
You can see below I have listed a piece of InitRules2.
4. I store the passed pointer to IHandle_DS in another class called
CAlterObj.
5. The first method to be called from InitRules2 is DBInitCommandTemplate
6. If you now look at method DBInitCommandTemplate below you can see that I
use the local Session and local DS in the previous code in several places
but in the new code I can't use the local Session because of the new
functionality.
I must in some way use the CSession object that is stored in the concrete
C++ class CHandle_DS but that is not easy because of the COM interface
IHandle_DS.
The reason for storing this CDataSource and CSession in CHandel_DS is to
keep the database open until I close it at the end of C# asp.net. So I have
to drag this
CHandle_DS object from C# asp.net into the InitRules2 because of keeping
the status of my connection to the database.
So can you give me some piece of advice how to modify or create a new
interface so I
can access the object Session in method DBInitCommandTemplate see below and
LoadProcedureRules below.
Note in especially that I only use the object Session in both
DBInitCommandTemplate and
LoadProcedureRules.
STDMETHODIMP CSyntaxObj::InitRules2(IHandle_DS* handle_ds, BSTR Provider,
BSTR DataSource, BSTR UserId, BSTR Password, BSTR ProductID, BSTR Revision,
BSTR ApplicationID, BSTR ApplicationRev, BSTR SubfileID,
VARIANT_BOOL *bRes)
{
m_pAltObj = new CAlterObj;
m_pAltObj->m_handle_DS = handle_ds;
m_pAltObj->DBInitCommandTemplate(some parameter here)))
}
HRESULT CAlterObj::DBInitCommandTemplate(some parameter here)
{
....
CCommand<CAccessor<CSetRole> > sqlRole;
//CSession Session; // old code
//CDataSource DS; // old code
//hr = DS.Open(); // old code
//hr = Session.Open(DS); // old code
hr = sqlRole.Open(Session);
hr = LoadProcedureRules(&Session,&dbPropSet,ProductID, Revision,
SubfileID);
....
}
STDMETHODIMP Handle_DS::OpenDS(VARIANT_BOOL *bRes)
{
HRESULT hr S_OK;
hr = DS.Open("OraOLEDB.Oracle","IDTHU1","CCR_DTH_USER","P55534552");
hr = Session.Open(DS);
return hr;
}
HRESULT CAlterObj::LoadProcedureRules(CSession *pSession, CDBPropSet
*pDbPropSet, BSTR ProductId, BSTR Revision, BSTR SubfileID)
{
HRESULT hr S_OK;
CCommand<CAccessor<CDbProcedureRulesGet> > sqlItems;
hr = sqlItems.Open(*pSession, NULL, pDbPropSet);
....
}
//Tony