비동기 작업 관리
Windows 8 및 Windows Server 2012부터 Virtual Disk Service는 Windows Storage 관리 API에 의해 대체되었습니다.
다음 코드 예제에서는 호출자가 비동기 개체에서 작동하는 방법을 보여 줍니다. 여기서 SynchronousCreateLun 함수는 지정된 매개 변수를 사용하여 비동기 IVdsSubSystem::CreateLun 메서드를 호출합니다. 함수는 비동기 CreateLun 메서드 호출이 완료될 때까지 비동기 개체에서 대기합니다. IVdsAsync::Wait 메서드가 반환되면 SynchronousCreateLun 새로 만든 LUN에 대한 IVdsLun 인터페이스를 가져오고 out 인수로 반환합니다.
//
// 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 SynchronousCreateLun(
IVdsSubSystem *pSubsystem,
VDS_LUN_TYPE type,
ULONGLONG ullSize,
VDS_OBJECT_ID *pDriveIdArray,
LONG lNumberOfDrives,
LPWSTR pwszUnmaskingList,
VDS_HINTS *pHints,
IVdsLun **ppLun)
{
HRESULT hResult = S_OK;
HRESULT hResult2 = S_OK;
IVdsAsync *pAsync = NULL;
VDS_ASYNC_OUTPUT AsyncOut;
IUnknown* pUnknown = NULL;
ZeroMemory( &AsyncOut, sizeof(VDS_ASYNC_OUTPUT));
hResult = pSubsystem->CreateLun(
type,
ullSize,
pDriveIdArray,
lNumberOfDrives,
pwszUnmaskingList,
pHints,
&pAsync);
if (SUCCEEDED(hResult) && (!pAsync)) {
hResult = E_UNEXPECTED; // Errant provider, returned S_OK
// with a NULL pointer.
}
if (SUCCEEDED(hResult)) {
// Wait until the Async is done.
hResult2 = pAsync->Wait( &hResult, &AsyncOut);
if (SUCCEEDED(hResult) && FAILED(hResult2)) {
hResult = hResult2;
}
}
if (SUCCEEDED(hResult) && (VDS_ASYNCOUT_CREATELUN != AsyncOut.type)) {
hResult = E_UNEXPECTED; // Errant provider, returned S_OK
// with an unexpected type.
}
if (SUCCEEDED(hResult)) {
pUnknown = AsyncOut.cl.pLunUnk;
if (!pUnknown) {
hResult = E_UNEXPECTED; // Errant provider, returned
// S_OK with a NULL pointer.
}
}
if (SUCCEEDED(hResult)) {
hResult = pUnknown->QueryInterface(IID_IVdsLun, (void **)ppLun);
}
_SafeRelease(pAsync);
_SafeRelease(pUnknown);
return hResult;
}
관련 항목