비동기 작업 관리
[Windows 8 및 Windows Server 2012 가상 디스크 서비스는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;
}
관련 항목