共用方式為


實作 WDS 的通訊協定處理常式

注意

Windows Desktop Search 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 介面的 GetChunkGetValue 方法迴圈,傳回代表容器中每個專案的 URL 清單。

首先, GetChunk 會傳回已設定屬性的 FULLPROSPEC,GATHER_PROPSET和下列其中一項:

  • 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 Description
D5CDD505-2E9C-101B-9397-08002B2CF9AE DisplayFolder 搜尋結果中向使用者顯示的資料夾路徑
D5CDD505-2E9C-101B-9397-08002B2CF9AE FolderName 父資料夾的顯示名稱

 

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

新增通訊協定處理常式選項功能

若要讓通訊協定處理常式具有預設起始頁 (和輸入節點 URL) ,您必須實作 ISearchProtocolOptions 介面。 在未來的 WDS 版本中,此介面會提供 [選項] 對話方塊的勾點,以提供增強的使用者體驗。 此介面提供下列功能:

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

ISearchProtocolOptions

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

方法 Description
CheckRequirements 判斷是否符合自訂通訊協定處理常式的最低需求
GetDefaultCrawlScope 傳回自訂通訊協定處理常式之指定存放區內的預設 URL 清單
GetRequirements 識別自訂通訊協定處理常式最低需求的使用者易記當地語系化描述

 

參考

通知變更的索引

使用殼層延伸模組新增圖示、預覽和操作功能表

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