列挙オブジェクトの操作
[Windows 8およびWindows Server 2012以降では、次のようになります。Virtual Disk Service COMインターフェイスは、Windows Storage Management API に置き換えられます。
次のコード例は、IEnumVdsObject インターフェイスを使用して、呼び出し元が列挙オブジェクトを操作する方法を示しています。 列挙オブジェクトによって返される情報は静的であることに注意してください。 新しい構成の変更を確認するには、オブジェクトを再度クエリする必要があります。
GetControllerById 関数は、pSubsystem パラメーターで指定された IVdsSubSystem インターフェイスを受け取り、サブシステム内のコントローラーに対するクエリを実行し、返された列挙を反復処理して、pControllerId パラメーターで指定された GUID と一致する GUID を持つコントローラーを検索します。 一致するコントローラーが見つかった場合は、ppController パラメーターと 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;
}
関連トピック