共用方式為


實作 WDS 的通訊協議處理程式

注意

Windows 桌面搜尋 2.x 是一種過時的技術,最初作為 Windows XP 和 Windows Server 2003 的附加元件提供。 在之後的版本中,請改用 Windows 搜尋

建立通訊協議處理程式牽涉到實作 ISearchProtocol 來管理 UrlAccessor 物件, IUrlAccessor,以產生數據存放區中專案的元數據及識別適當的篩選、IProtocolHandlerSite 來具現化 SearchProtocol 物件並識別適當的篩選,以及 IFilter篩選專屬檔案,或列舉和篩選階層式儲存的檔案。 通訊協議處理程式必須多線程。

本節包含下列主題:

URL 上的注意事項

Microsoft Windows 桌面搜尋 (WDS) 使用 URL 來唯一識別檔案系統、資料庫式儲存區或網路上的項目。 定義項目節點的 URL 稱為起始頁;WDS 會從該起始頁開始,並以遞歸方式編目數據存放區。 典型的 URL 結構為:

protocol://host/path/name.extension

注意

當您想要新增資料存放區時,必須選擇一個不會與現有資料存放區衝突的名稱來識別它。 我們建議使用此命名慣例:companyName.scheme。

 

通訊協議處理程式介面

ISearchProtocol

ISearchProtocol 介面會叫用、初始化和管理 UrlAccessor 物件。 如需實作 ISearchProtocol 介面的詳細資訊,請參閱 ISearchProtocol 介面參考。

IUrlAccessor

針對指定的 URL,IUrlAccessor 介面會產生位置結構和所含項目的元數據,並將這些項目綁定到篩選器。 IUrlAccessor 物件是由 SearchProtocol 物件具現化和初始化;不過,您也可以實作內部初始化方法,以便您的 IUrlAccessor 物件可執行通訊協定處理程式特定的初始化工作,例如驗證所存取專案的 URL,或檢查上次修改的時間,以判斷檔案是否必須在目前的編目中處理。

注意

系統會忽略目錄的修改時間。 IUrlAccessor 對象必須列舉子物件,以判斷是否有任何修改或刪除。

 

UrlAccessor 物件的大部分設計都取決於結構是階層式還是連結型。 對於階層式數據存放區,UrlAccessor 對象必須尋找可列舉其內容的篩選。 階層式和連結型通訊協議處理程式之間的另一個區別是使用IsDirectory方法。 在連結型通訊協議處理程式中,此方法應該傳回S_FALSE。 階層式通訊協議處理程式必須針對容器傳回S_OK。

如需實作 IUrlAccessor 介面的進一步指示,請參閱 IUrlAccessor 介面 參考。

IProtocolHandlerSite

這個介面可用來具現化 SearchProtocol 物件,並提供 UrlAccessor 物件,並針對指定的類別標識碼 (CLSID) 提供適當的篩選。

適用於容器的 IFilters

如果您要實作階層式通訊協定處理程式,則必須實作容器 IFilter元件,以列舉代表容器或資料夾的 URL。 列舉過程是通過 IFilter 介面的 GetChunk 方法和 GetValue 方法進行的一個迴圈,這些方法會傳回代表容器中每個專案的 URL 清單。

首先,GetChunk 傳回具有屬性集 GATHER_PROPSET 的 FULLPROSPEC,以及下列其中之一:

  • PID_GTHR_DIRLINK,「項目」的 URL,不包括最後的修改時間,或
  • PID_GTHR_DIRLINK_WITH_TIME,URL 以及上次修改的時間

GATHER_PROPSET的屬性集 GUID 為 0B63E343-9CCC-11D0-BCDB-00805FCCCE04。 PROPSPEC 屬性是 PID_GTHR_DIRLINK=2 或 PID_GTHR_DIRLINK_WITH_TIME = 12 十進制。

傳回PID_GTHR_DIRLINK_WITH_TIME更有效率,因為索引器可以立即判斷專案是否需要編製索引,而不需呼叫 ISearchProtocol->CreateUrlAccessor() 和 IUrlAccessor->GetLastModified() 方法。

然後,GetValue 會傳回 URL 的 PROPVARIANT(如果使用的話,則上次修改時間),如下所示:

  • VT_LPWSTR,子項目的 URL 或
  • URL 的向量,後面接著 FILETIME

下列範例程式代碼示範如何建置適當的PID_GTHR_DIRLINK_WITH_TIME。

注意

本程式代碼和資訊是「依目前」提供,但未明示或默示任何種類的擔保,包括但不限於適銷性及/或適合特定用途的默示擔保。

著作權(C) Microsoft。 保留所有權利。

 

// params are assumed to be valid

HRESULT GetPropVariantForUrlAndTime(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
    *ppPropValue = NULL;

    // allocate the propvariant pointer
    *ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*ppPropValue));
    HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;

    if (SUCCEEDED(hr))
    {
        PropVariantInit(*ppPropValue);  // zero init the value

        // now allocate enough memory for 2 nested PropVariants.
        // PID_GTHR_DIRLINK_WITH_TIME is an array of 2 PROPVARIANTs
        PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
        hr = pVector ? S_OK : E_OUTOFMEMORY;

        if (SUCCEEDED(hr))
        {
            // set the container PROPVARIANT that it is a vector of 2 PROPVARIANTS
            (*ppPropValue)->vt = VT_VARIANT | VT_VECTOR;
            (*ppPropValue)->capropvar.cElems = 2;
            (*ppPropValue)->capropvar.pElems = pVector;
            PWSTR pszUrlAlloc;
            hr = SHStrDup(pszUrl, &pszUrlAlloc);

            if (SUCCEEDED(hr))
            {
                // now fill the array of PROPVARIANTS
                // put the pointer to the URL into the vector
                (*ppPropValue)->capropvar.pElems[0].vt = VT_LPWSTR; 
                (*ppPropValue)->capropvar.pElems[0].pwszVal = pszUrlAlloc;

                 // put the FILETIME into vector
                (*ppPropValue)->capropvar.pElems[1].vt = VT_FILETIME; 
                (*ppPropValue)->capropvar.pElems[1].filetime = ftLastModified;
            }

            else
            {
                CoTaskMemFree(pVector);
            }
        }
 
        if (FAILED(hr))
        {
            CoTaskMemFree(*ppPropValue);
            *ppPropValue = NULL;
        }
    }
    return S_OK;
}

注意

容器 IFilter元件應該一律列舉所有子 URL,即使子 URL 尚未變更,因為索引器會透過列舉程式偵測刪除。 如果DIR_LINKS_WITH_TIME中的日期輸出指出數據尚未變更,索引器就不會更新該 URL 的數據。

 

實體 URL 是 UrlAccessor 物件處理的 URL。 如果篩選條件未發出使用者易記的 DisplayUrl,WDS 會在搜尋結果中向使用者顯示實體 URL。 WDS 架構包含兩個屬性,可控制向用戶顯示的內容,如下表所示。

GUID(全域唯一識別碼) PROPSPEC 描述
D5CDD505-2E9C-101B-9397-08002B2CF9AE 顯示資料夾 搜尋結果中向用戶顯示的資料夾路徑
D5CDD505-2E9C-101B-9397-08002B2CF9AE 資料夾名稱 父資料夾的顯示名稱

 

如果您的程式代碼未發出 DisplayFolder 或 FolderName,則會從 DisplayUrl 計算這些值。 URL 中的正斜線表示存放區或文件系統內的容器。

新增通訊協議處理程式選項功能

若要為協議處理程式設定預設的起始頁(和項目節點 URL),您必須實作 ISearchProtocolOptions 介面。 在未來版本的 WDS 中,此介面會提供連結至 [選項] 對話框,以提供增強的用戶體驗。 此介面提供下列功能:

  • 判斷是否符合通訊協議處理程式的需求。 例如,您的通訊協定處理程式存放區可能需要存取指定的應用程式,才能正確編製應用程式數據的索引,但該應用程式無法使用。
  • 識別通訊協定處理程式處理專案所需的最低需求。 需求可以用使用者易記的當地語系化描述來表示,例如「Microsoft Outlook 2000 或更高版本」。
  • 定義通訊協定處理程式預設應該處理的 URL。

搜尋協定選項

下表說明您需要針對 ISearchProtocolOptions 介面實作的方法。

方法 描述
檢查要求 判斷是否符合自定義通訊協議處理程式的最低需求
GetDefaultCrawlScope 傳回自定義通訊協定處理程式指定存放區內的預設 URL 清單
GetRequirements 識別自定義通訊協議處理程式的最低需求,提供具當地語系化且易於理解的描述。

 

參考

通知索引變更

使用 Shell 擴充模組新增圖示、預覽和內容功能表

安裝和註冊通訊協定處理程式