107 lines
3.6 KiB
C++
107 lines
3.6 KiB
C++
//---------------------------------------------------------------------------
|
|
// Microsoft OLE DB Programmer's Reference Sample
|
|
// Copyright (C) 1998 By Microsoft Corporation.
|
|
//
|
|
// @doc
|
|
//
|
|
// @module ENUM.CPP
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
#include "prsample.h" // Programmer's Reference Sample includes
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// 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, _countof(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;
|
|
}
|