使用列舉物件
[從 Windows 8 和 Windows Server 2012 開始, 虛擬磁碟服務 COM 介面已由 Windows 記憶體管理 API 取代。
下列程式代碼範例示範呼叫端如何使用 IEnumVdsObject 介面搭配列舉對象運作。 請注意,列舉對象傳回的資訊是靜態的。 您必須再次查詢 物件,才能看到新的組態變更。
GetControllerById 函式會採用由 pSubsystem 參數指定的 IVdsSubSystem 介面,並查詢子系統中的控制器,然後逐一查看傳回的列舉,搜尋具有符合 pControllerId 參數所指定之 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;
}
相關主題