OLE DB Programmer's Reference |
The code in this example shows how to create and use an enumerator object.
///////////////////////////////////////////////////////////////// // myCreateEnumerator // // This function creates an enumerator, obtains a sources rowset // from it, displays the rowset to the user, and allows the user // to specify the ProgID of a provider. The CLSID that matches // this ProgID is retuned to the caller in *pCLSID. // ///////////////////////////////////////////////////////////////// HRESULT myCreateEnumerator ( REFCLSID clsidEnumerator, CLSID * pCLSID ) { HRESULT hr; IUnknown * pIUnkEnumerator = NULL; ISourcesRowset * pISourcesRowset = NULL; IRowset * pIRowset = NULL; IDBInitialize * pIDBInitialize = NULL; WCHAR wszProgID[MAX_NAME_LEN + 1] = {0}; const ULONG cProperties = 2; DBPROP rgProperties[cProperties]; DBPROPSET rgPropSets[1]; // Create the enumerator object. We ask for IUnknown when creating // the enumerator because some enumerators may require initialization // before we can obtain a sources rowset from the enumerator. This is // indicated by whether or not the enumerator object exposes // IDBInitialize. (We don't want to ask for IDBInitialize, since // enumerators that don't require initialization will cause the // CoCreateInstance to fail.) XCHECK_HR(hr = CoCreateInstance( clsidEnumerator, // clsid--enumerator NULL, // pUnkOuter CLSCTX_INPROC_SERVER, // dwClsContext IID_IUnknown, // riid (void**)&pIUnkEnumerator)); // ppvObj // If the enumerator exposes IDBInitialize, we need to initialize it. if( SUCCEEDED(hr = pIUnkEnumerator->QueryInterface(IID_IDBInitialize, (void**)&pIDBInitialize)) ) { CHECK_HR(hr = myDoInitialization(pIUnkEnumerator)); } // Set properties on the rowset, to request additional functionality. myAddRowsetProperties(rgPropSets, cProperties, rgProperties); // Obtain a sources rowset from the enumerator. This rowset contains // all of the OLE DB providers that this enumerator is able to list. XCHECK_HR(hr = pIUnkEnumerator->QueryInterface(IID_ISourcesRowset, (void**)&pISourcesRowset)); XCHECK_HR(hr = pISourcesRowset->GetSourcesRowset( NULL, // pUnkOuter IID_IRowset, // riid 1, // cPropSets rgPropSets, // rgPropSets (IUnknown**)&pIRowset)); // ppRowset // Display the rowset to the user. This will allow the user to // perform basic navigation of the rowset and will allow the user // to select a row containing a desired provider. CHECK_HR(hr = myDisplayRowset(pIRowset, L"SOURCES_NAME", MAX_NAME_LEN, wszProgID)); // Obtain the ProgID for the provider to use from the user. // The default value for this is the value of the SOURCES_NAME // column in the row selected by the user previously. myGetInputFromUser(wszProgID, L"\nType the ProgID of a provider" L" to use [Enter = `%s`]: ", wszProgID); XCHECK_HR(hr = CLSIDFromProgID(wszProgID, pCLSID)); CLEANUP: if( pIUnkEnumerator ) pIUnkEnumerator->Release(); if( pISourcesRowset ) pISourcesRowset->Release(); if( pIRowset ) pIRowset->Release(); if( pIDBInitialize ) pIDBInitialize->Release(); return hr; }
1998-2001 Microsoft Corporation. All rights reserved.