Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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 the enumerator object exposes IDBInitialize
// or not (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;
}