how do I use MFC data member from a concrete C++ class from a COM interface
Hello
I have created a new thread because the subject is somewhat different.
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 a 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 my new design for the new concrete C++ object
1. I create a concrete C++ class from C# asp.net like this
CHande_DS handle_ds = new Handle_DS();
This works perfect.
2. I call OpenDS like this
handle_ds.OpenDS();
This works also perfect.
3. I pass this concrete C++ object into a method called InitRules2 which is
defined in the COM interface ISyntaxObj
This works also perfect.
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.
This works also perfect.
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 of type CSession and local DS of type CDataSource
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 say that these two concrete classes CDataSource and CSession is part
of the MFC framework and not any user defined
class.
You can use MSDN help to lookup CDataSource and CSession.
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 advice how to modify or create a new interface so I
can access the concrete object Session
in method DBInitCommandTemplate see below.
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)
{
....
//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;
}
//Tony