Aracılığıyla paylaş


Zaman Uyumsuz İşlemleri Yönetme

Windows 8 ve Windows Server 2012'den itibaren, Sanal Disk Hizmeti, Windows Depolama Yönetimi API'si tarafından yerini almıştır.

Aşağıdaki kod örneği, çağıranın zaman uyumsuz bir nesneyle nasıl çalıştığını gösterir. Burada SynchronousCreateLun işlevi, verilen parametreleri kullanarak zaman uyumsuz IVdsSubSystem::CreateLun yöntemini çağırır. İşlev, eşzamanlı olmayan CreateLun yöntemi çağrısının tamamlanması için eşzamanlı olmayan nesnede bekler. IVdsAsync::Wait yöntemi geri döndüğünde, SynchronousCreateLun, yeni oluşturulan LUN için IVdsLun arabirimini alır ve bunu bir dış bağımsız değişken olarak döndürür.

//
// 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;
}

VDS Kullanımı

Yardımcı Nesneleri

IVdsSubSystem::CreateLun

IVdsAsync::Wait

IVdsLun