가상화 인스턴스 수명 주기

공급자 애플리케이션은 하나 이상의 가상화 인스턴스를 유지 관리합니다. 각 가상화 instance 수명 주기에서 다음 네 단계를 수행합니다.

  1. 만들기
  2. Startup 클래스
  3. 런타임
  4. 종료

instance 가상화를 종료한 후에는 공급자가 가상화를 다시 만들기 위해 다시 만들 필요가 없습니다. 그것은 단순히 다시 시작할 수 있습니다.

참고: 이 섹션에서는 ProjFS API의 예를 보여 줍니다. 각 예제는 기본 API 사용을 설명하기 위한 것입니다. 이러한 예제에서 사용되지 않는 옵션에 대한 설명서는 ProjFS API 참조를 참조하세요.

가상화 루트 만들기

공급자가 로컬 파일 시스템에 항목을 프로젝션하는 가상화 instance 시작하려면 먼저 가상화 루트를 만들어야 합니다. 가상화 루트는 공급자가 디렉터리와 파일 트리를 프로젝션하는 디렉터리입니다.

가상화 루트를 만들려면 공급자는 다음을 수행해야 합니다.

  1. 가상화 루트로 사용할 디렉터리를 만듭니다.

    공급자는 CreateDirectory와 같이 를 사용하여 가상화 루트로 사용할 디렉터리를 만듭니다.

    HRESULT hr;
    const wchar_t* rootName = LR"(C:\virtRoot)";
    if (!CreateDirectoryW(rootName, nullptr))
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        wprintf(L"Failed to create virtualization root (0x%08x)\n", hr);
        return;
    }
    
  2. 가상화 instance ID를 만듭니다.

    모든 가상화 instance 가상화 instance ID라는 고유 ID가 있습니다. 시스템은 이 값을 사용하여 해당 콘텐츠가 연결된 instance 가상화를 식별합니다.

    GUID instanceId;
    hr = CoCreateGuid(&instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to create instance ID (0x%08x)\n", hr);
        return;
    }
    
  3. 새 디렉터리를 가상화 루트로 표시합니다.

    공급자는 PrjMarkDirectoryAsPlaceholder를 호출하여 새 디렉터리를 가상화 루트로 표시하고 가상화 instance 할당합니다.

    hr = PrjMarkDirectoryAsPlaceholder(rootName,
                                       nullptr,
                                       nullptr,
                                       &instanceId);
    if (FAILED(hr))
    {
        wprintf(L"Failed to mark virtualization root (0x%08x)\n", hr);
        return;
    }
    

공급자는 각 가상화 instance 대해 가상화 루트를 한 번만 만들어야 합니다. 루트가 만들어지면 루트를 다시 만들지 않고 연결된 instance 반복적으로 시작하고 중지할 수 있습니다.

가상화 instance 시작

가상화 루트가 만들어지면 공급자는 가상화 instance 시작해야 합니다. 그러면 공급자가 콜백을 수신하고 데이터를 제공할 준비가 되었음을 ProjFS에 알려줍니다.

공급자가 가상화 instance 시작하려면 다음을 수행해야 합니다.

  1. 콜백 테이블을 설정합니다.

    ProjFS는 공급자가 구현한 콜백 루틴을 호출하여 공급자와 통신합니다. 공급자는 콜백 루틴에 대한 포인터로 PRJ_CALLBACKS 구조체를 채웁니다.

    PRJ_CALLBACKS callbackTable;
    
    // Supply required callbacks.
    callbackTable.StartDirectoryEnumerationCallback = MyStartEnumCallback;
    callbackTable.EndDirectoryEnumerationCallback = MyEndEnumCallback;
    callbackTable.GetDirectoryEnumerationCallback = MyGetEnumCallback;
    callbackTable.GetPlaceholderInfoCallback = MyGetPlaceholderInfoCallback;
    callbackTable.GetFileDataCallback = MyGetFileDataCallback;
    
    // The rest of the callbacks are optional.
    callbackTable.QueryFileNameCallback = nullptr;
    callbackTable.NotificationCallback = nullptr;
    callbackTable.CancelCommandCallback = nullptr;
    
  2. 인스턴스를 시작합니다.

    공급자는 PrjStartVirtualizing을 호출하여 가상화 instance 시작합니다.

    PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT instanceHandle;
    hr = PrjStartVirtualizing(rootName,
                              &callbackTable,
                              nullptr,
                              nullptr,
                              &instanceHandle);
    if (FAILED(hr))
    {
        wprintf(L"Failed to start the virtualization instance (0x%08x)\n", hr);
        return;
    }
    

    PrjStartVirtualizinginstanceHandle 매개 변수는 가상화 instance 대한 핸들을 반환합니다. 공급자는 다른 ProjFS API를 호출할 때 이 핸들을 사용합니다.

가상화 instance 런타임

PrjStartVirtualizing 호출이 반환되면 ProjFS는 가상화 instance 파일 시스템 작업에 대한 응답으로 공급자의 콜백 루틴을 호출합니다. 공급자가 다양한 파일 시스템 작업을 처리하는 방법에 대한 자세한 내용은 다음 섹션을 참조하세요.

가상화 instance 종료

공급자가 콜백 수신 및 데이터 제공을 중지하려고 한다는 것을 ProjFS에 알리려면 공급자가 가상화 instance 중지해야 합니다. 이렇게 하려면 공급자가 PrjStopVirtualizing을 호출하여 PrjStartVirtualizing 호출에서 받은 가상화 instance 핸들을 전달합니다.

PrjStopVirtualizing(instanceHandle);

이 호출이 반환될 때까지 ProjFS는 공급자의 콜백 루틴을 계속 호출할 수 있습니다.