Utilisation d’objets d’énumération
[À compter de Windows 8 et Windows Server 2012, l'interface COM du service de disque virtuel est remplacée par l’API gestion du stockage Windows].
L’exemple de code suivant montre comment un appelant fonctionne avec des objets d’énumération à l’aide de l’interface IEnumVdsObject. Remarque : les informations renvoyées par un objet d’énumération sont statiques. Il faut interroger à nouveau l’objet pour voir les nouvelles modifications de configuration.
La fonction GetControllerById prend une interface IVdsSubSystem, spécifiée par le paramètre pSubsystem, et interroge les contrôleurs dans le sous-système, puis itère dans l’énumération renvoyée à la recherche d’un contrôleur avec un GUID qui correspond au GUID spécifié par le paramètre pControllerId. Si un contrôleur correspondant est trouvé, il est renvoyé par le paramètre ppController avec un 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;
}
Rubriques connexes