This example connects directly to a specific MDP by using the provider’s unique class identifier, in this case represented by CLSID_GENOLAP. After obtaining an IID_IDBSchemaRowset pointer, this function proceeds to call the function MDPSchemaSample() (the code for which appears in the next section) in order to traverse the schema rowset for the MDP data source.
//
HRESULT MDPConnectUsingClsId(void)
{
HRESULT hr;
// Initialize property values
for (ULONG i=0; i < NUMELEM(rgProperties); i++)
VariantInit(&rgProperties[i].vValue);
// Create the instance of the MSOLAP provider
IDBInitialize *pIDBInitialize = NULL;
hr = CoCreateInstance(CLSID_MSOLAP, NULL, CLSCTX_INPROC_SERVER,
IID_IDBInitialize, (LPVOID*)&pIDBInitialize);
IDBProperties *pIDBProperties = NULL;
hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)
&pIDBProperties);
// Identify property set
DBPROPSET rgPropertySet[1];
DBPROP rgProperties[1];
rgPropertySet[0].rgProperties = rgProperties;
rgPropertySet[0].cProperties = 1;
rgPropertySet[0].guidPropertySet = DBPROPSET_DBINIT;
// Fill in data source
rgProperties[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
rgProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED;
rgProperties[0].colid = DB_NULLID;
rgProperties[0].vValue.vt = VT_BSTR;
rgProperties[0].vValue.bstrVal = SysAllocString(L"LocalHost");
assert(rgProperties[0].vValue.bstrVal);
hr = pIDBProperties->
SetProperties(NUMELEM(rgPropertySet), rgPropertySet);
// Initialize and create the session.
hr = pIDBInitialize->Initialize();
IDBCreateSession *pIDBCreateSession = NULL;
hr = pIDBInitialize->
QueryInterface(IID_IDBCreateSession,
(void **) &pIDBCreateSession);
IDBSchemaRowset *pIDBSchemaRowset = NULL;
hr = pIDBCreateSession->CreateSession(NULL, IID_IDBSchemaRowset,
(IUnknown **) &pIDBSchemaRowset);
IRowset* pIRowset = NULL;
hr = MDPSchemaSample(pIDBSchemaRowset, (IUnknown**)pIRowset);
if (pIDBInitialize) pIDBInitialize->Release();
if (pIDBProperties) pIDBProperties->Release();
if (pIDBCreateSession) pIDBCreateSession->Release();
if (pIDBSchemaRowset) pIDBSchemaRowset->Release();
if (pIRowset) pIRowset->Release();
return hr;
}