Creating an Instance of a Data Source Object Directly by Using the Provider's CLSID

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 section Creating a Schema Rowset) to traverse the schema rowset for the MDP data source object.

//
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;
}