提供者應用程式會維護一或多個虛擬化實例。 每個虛擬化實例都會在其生命週期中經歷四個階段:
- 創造
- 啟動
- 運行
- 關閉
請注意,關閉虛擬化實例之後,提供者不需要重新建立它以重複使用它。 它可以簡單地啟動它再次。
附注:本節顯示 ProjFS API 的範例。 每個範例都是為了說明基本的 API 使用方式。 如需這些範例中未使用之選項的檔案,請參閱 ProjFS API 參考。
建立虛擬化根目錄
提供者必須先建立虛擬化根目錄,提供者才能啟動將專案投影到本機文件系統的虛擬化實例。 虛擬化根目錄是提供者在其中投影目錄和檔案樹狀目錄的目錄。
若要建立虛擬化根目錄,提供者必須:
建立目錄作為虛擬化根目錄。
提供者會使用 建立目錄做為虛擬化根目錄,例如 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; }建立虛擬化實例標識碼。
每個虛擬化實例都有稱為 虛擬化實例識別碼的唯一識別碼,。 系統會使用此值來識別其內容相關聯的虛擬化實例。
GUID instanceId; hr = CoCreateGuid(&instanceId); if (FAILED(hr)) { wprintf(L"Failed to create instance ID (0x%08x)\n", hr); return; }將新目錄標示為虛擬化根目錄。
提供者會呼叫 PrjMarkDirectoryAsPlaceholder,將新目錄標示為虛擬化根目錄,並將其指派給虛擬化實例。
hr = PrjMarkDirectoryAsPlaceholder(rootName, nullptr, nullptr, &instanceId); if (FAILED(hr)) { wprintf(L"Failed to mark virtualization root (0x%08x)\n", hr); return; }
提供者只需要為每個虛擬化實例建立虛擬化根目錄一次。 建立根之後,就可以重複啟動和停止其相關聯的實例,而不重新建立根目錄。
啟動虛擬化實例
建立虛擬化根目錄之後,提供者必須啟動虛擬化實例。 這會發出 ProjFS 的訊號,指出提供者已準備好接收回呼並提供數據。
若要啟動虛擬化實例,提供者必須:
設定回呼數據表。
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;啟動 實例。
提供者會呼叫 PrjStartVirtualizing 來啟動虛擬化實例。
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; }PrjStartVirtualizing的 instanceHandle 參數會傳回虛擬化實例的句柄。 提供者會在呼叫其他 ProjFS API 時使用此句柄。
虛擬化實例運行時間
呼叫 PrjStartVirtualizing 傳回之後,ProjFS 會叫用提供者的回呼例程,以回應虛擬化實例中的文件系統作業。 如需提供者如何處理各種文件系統作業的資訊,請參閱下列各節:
關閉虛擬化實例
若要發出 ProjFS 的訊號,表示提供者想要停止接收回呼和提供數據,提供者必須停止虛擬化實例。 若要這樣做,提供者會呼叫 PrjStopVirtualizing,並將句柄傳遞給從呼叫 PrjStartVirtualizing的虛擬化實例。
PrjStopVirtualizing(instanceHandle);
請注意,在呼叫傳回之前,ProjFS可能會繼續叫用提供者的回呼例程。