Werken met enumeratie-objecten
[Vanaf Windows 8 en Windows Server 2012 wordt de Virtual Disk Service COM-interface vervangen door de Windows Storage Management API.]
In het volgende codevoorbeeld ziet u hoe een aanroeper werkt met opsommingsobjecten met behulp van de IEnumVdsObject interface. Houd er rekening mee dat de informatie die wordt geretourneerd door een opsommingsobject statisch is. U moet het object opnieuw opvragen om nieuwe configuratiewijzigingen te zien.
De functie GetControllerById gebruikt een IVdsSubSystem-interface, die is opgegeven door de parameter pSubsystem en voert query's uit voor de controllers in het subsysteem en doorloopt de geretourneerde opsomming die zoekt naar een controller met een GUID die overeenkomt met de GUID die is opgegeven door de parameter pControllerId. Als er een overeenkomende controller wordt gevonden, wordt deze geretourneerd door de parameter ppController, samen met een S_OK HRESULT-.
//
// Simple macro to release non-null interfaces.
//
#include <windows.h>
#include "vds.h"
#include <stdio.h>
#define _SafeRelease(x) {if (NULL != x) { x->Release(); x = NULL; } }
HRESULT GetControllerById(
IN IVdsSubSystem *pSubsystem,
IN CONST VDS_OBJECT_ID *pControllerId,
OUT IVdsController **ppController)
{
VDS_CONTROLLER_PROP vdsControllerProperties;
IEnumVdsObject *pEnumController = NULL;
IVdsController *pController = NULL;
IUnknown *pUnknown = NULL;
HRESULT hResult = S_OK;
ULONG ulFetched = 0;
BOOL bDone = FALSE;
ZeroMemory(&vdsControllerProperties, sizeof(VDS_CONTROLLER_PROP));
// Query for the enumeration of controllers belonging
// to the given subsystem.
hResult = pSubsystem->QueryControllers(&pEnumController);
if (SUCCEEDED(hResult) && (!pEnumController))
{
hResult = E_UNEXPECTED; // Errant provider,
// returned S_OK
// with a NULL pointer.
}
if (SUCCEEDED(hResult))
{
// Enumerate through all the controllers this subsystem
// contains to find the controller of interest.
while (!bDone)
{
ulFetched = 0;
hResult = pEnumController->Next(1, &pUnknown, &ulFetched);
if (hResult == S_FALSE)
{
hResult = E_INVALIDARG;
break;
}
if (SUCCEEDED(hResult) && (!pUnknown))
{
hResult = E_UNEXPECTED; // Errant provider,
// returned S_OK with
// a NULL pointer
}
// Use an IVdsController interface to get the controller
// properties and check for the desired GUID.
if (SUCCEEDED(hResult))
{
hResult = pUnknown->QueryInterface(IID_IVdsController,
(void **) &pController);
}
if (SUCCEEDED(hResult) && (!pController))
{
hResult = E_UNEXPECTED; // Errant provider,
// returned S_OK
// with a NULL pointer
}
if (SUCCEEDED(hResult))
{
hResult = pController->
GetProperties( &vdsControllerProperties);
}
if (SUCCEEDED(hResult)
&& IsEqualGUID(*pControllerId, vdsControllerProperties.id))
{
bDone = TRUE;
}
else
{
_SafeRelease(pController);
}
_SafeRelease(pUnknown);
//Free the strings in the properties structure.
if (NULL != vdsControllerProperties.pwszIdentification)
{
CoTaskMemFree(vdsControllerProperties.pwszIdentification);
}
ZeroMemory(&vdsControllerProperties, sizeof(VDS_CONTROLLER_PROP));
}
}
if (SUCCEEDED(hResult))
{
*ppController = pController;
}
_SafeRelease(pEnumController);
return hResult;
}
Verwante onderwerpen
-
VDS- gebruiken