實作 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 介面的 GetChunk 和 GetValue 方法迴圈,傳回代表容器中每個專案的 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 | 識別自訂通訊協定處理常式最低需求的使用者易記當地語系化描述 |
相關主題