Creating an Instance of a Data Source 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 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;
}