安裝通訊協議處理程式牽涉到將 DLL 複製到 Program Files 目錄中的適當位置,然後透過登錄註冊通訊協定處理程式。 安裝應用程式也可以新增搜尋根和範圍規則,以定義Shell數據源的預設編目範圍。
本主題的組織方式如下:
關於 URL
Windows 搜尋會使用 URL 來識別 Shell 資料來源階層中的專案。 階層中第一個節點的 URL 稱為搜尋根目錄 ;Windows 搜尋會開始在搜尋根目錄編製索引,要求通訊協定處理程式列舉每個 URL 的子連結。
典型的 URL 結構為:
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
下表說明 URL 語法。
語法 | 描述 |
---|---|
<通訊協定> | 識別要叫用 URL 的通訊協定處理程式。 |
{user SID} | 識別呼叫通訊協議處理程式的使用者安全性內容。 如果未識別任何使用者安全性識別碼 (SID),則會在系統服務的安全性內容中呼叫通訊協定處理程式。 |
<路徑> | 定義存放區的階層,其中每個正斜線 ('/') 都是資料夾名稱之間的分隔符。 |
<ItemID> | 表示識別子項的唯一字串(例如檔名)。 |
Windows 搜尋索引器會從 URL 修剪最終斜線。 因此,您無法依賴最終斜線的存在來識別目錄與專案。 您的通訊協議處理程式必須能夠處理此 URL 語法。 請確定您選取用來識別 Shell 數據源的通訊協定名稱不會與目前數據源衝突。 我們建議使用此命名慣例:companyName.scheme
。
如需建立 Shell 資料來源的詳細資訊,請參閱 實作基本資料夾物件介面。
實作通訊協議處理程式介面
建立通訊協定處理程式需要實作下列三個介面:
- ISearchProtocol 來管理 UrlAccessor 物件。
- IUrlAccessor 以公開屬性並識別殼層數據來源中專案的適當過濾器。
- IFilter 篩選專屬檔案,或列舉和篩選階層式儲存的檔案。
除了列出的三個必要介面之外,其他介面是選擇性的,而且您可以自由地實作最適合手邊工作的選用介面。
ISearchProtocol 和 ISearchProtocol2
SearchProtocol 介面會初始化和管理通訊協定處理程式 UrlAccessor 物件。 ISearchProtocol2 介面是 ISearchProtocol的選擇性擴充功能,並包含額外的方法來指定使用者和專案的詳細資訊。
IUrlAccessor、IUrlAccessor2、IUrlAccessor3 和 IUrlAccessor4
下表說明 IUrlAccessor 介面。
介面 | 描述 |
---|---|
IUrlAccessor | 針對指定的 URL,IUrlAccessor 介面可讓您存取 URL 中公開之項目的屬性。 它也可以將這些屬性系結至通訊協定處理程式特定的篩選條件(也就是與檔名相關聯的篩選條件除外)。 |
IUrlAccessor2 (選擇性) | IUrlAccessor2 介面透過方法來擴充 IUrlAccessor,這些方法包括取得項目屬性的代碼頁和其顯示URL,以及取得 URL 中項目類型(文件或目錄)的方法。 |
IUrlAccessor3 (選擇性) | IUrlAccessor3 介面透過取得使用者 SID 陣列的方法來擴充 IUrlAccessor2,使得搜尋通訊協定主機可以模擬這些使用者來索引該項目。 |
IUrlAccessor4 (選擇性) | IUrlAccessor4 介面會使用可識別項目內容是否應編製索引的方法,來擴充 IUrlAccessor3 介面的功能。 |
UrlAccessor 物件是由 SearchProtocol 物件具現化和初始化。 IUrlAccessor 介面可透過下表所述的方法存取重要的資訊片段。
方法 | 描述 |
---|---|
IUrlAccessor::GetLastModified | 傳回上次修改 URL 的時間。 如果這次的時間比上次索引器處理此 URL 的時間更接近現在,則會呼叫篩選處理程式(IFilter 介面的實作),以擷取該項目可能已變更的數據。 系統會忽略目錄的修改時間。 |
IUrlAccessor::IsDirectory | 識別 URL 是否代表包含子 URL 的資料夾。 |
IUrlAccessor::BindToStream | 系結至 IStream 介面,代表自定義數據存放區中檔案的數據。 |
IUrlAccessor::BindToFilter | 系結至特定協定處理常式的 IFilter,可公開項目的屬性。 |
IUrlAccessor4::ShouldIndexItemContent | 識別項目的內容是否應編製索引。 |
IProtocolHandlerSite
IProtocolHandlerSite 介面可用來具現化裝載於隔離進程中的篩選處理程式。 為指定的永續類別識別碼(CLSID)、文件儲存類別或副檔名取得適當的篩選處理程式。 要求主機進程系結至 IFilter 的優點是主機進程可以管理尋找適當篩選處理程式的程式,並控制呼叫處理程式所涉及的安全性。
實作容器的篩選處理程式
如果您要實作階層式通訊協定處理程式,則必須為列舉子 URL 的容器實作篩選處理程式。 篩選處理程式是 IFilter 介面的實作。 列舉過程是透過 IFilter::GetChunk 和 IFilter::GetValue 方法迴圈執行於 IFilter 介面上;每個子 URL 都被公開為屬性的值。
IFilter::GetChunk 會傳回容器的屬性。 若要列舉子 URL,IFilter::GetChunk 會傳回下列其中一項:
-
不含最後修改時間的項目 URL。 IFilter::GetValue 會傳回包含子 URL 的 PROPVARIANT。
PKEY_Search_UrlToIndexWithModificationTime:
URL 和上次修改的時間。 IFilter::GetValue 會傳回 PROPVARIANT,其中包含子 URL 的向量和上次修改時間。
傳回 PKEY_Search_UrlToIndexWithModificationTime 更有效率,因為索引器可以立即判斷專案是否需要編製索引,而不需呼叫 ISearchProtocol::CreateAccessor 和 IUrlAccessor::GetLastModified 方法。
下列範例程式代碼示範如何傳回 PKEY_Search_UrlToIndexWithModificationTime 屬性。
重要
著作權(c) Microsoft公司。 保留所有權利。
// Parameters are assumed to be valid
HRESULT GetPropVariantForUrlAndTime
(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
*ppPropValue = NULL;
// Allocate the propvariant pointer.
size_t const cbAlloc = sizeof(**ppPropValue);
*ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(cbAlloc));
HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
PropVariantInit(*ppPropValue); // Zero init the value
// Now allocate enough memory for 2 nested PropVariants.
// PKEY_Search_UrlToIndexWithModificationTime is an array of two PROPVARIANTs.
PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
hr = pVector ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// Set the container PROPVARIANT to be a vector of two 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 尚未變更,因為索引器會透過列舉程式偵測刪除。 如果 PKEY_Search_UrlToIndexWithModificationTime 中的日期輸出指出數據尚未變更,索引器就不會更新該 URL 的數據。
安裝和註冊通訊協議處理程式
安裝通訊協議處理程式牽涉到將 DLL 複製到 Program Files 目錄中的適當位置,然後註冊 DLL。 通訊協議處理程式應該實作自我註冊以進行安裝。 安裝應用程式也可以新增搜尋根目錄和範圍規則,來定義 Shell 資料來源的預設爬網範圍,這在本主題結尾的 確保您的項目被編製索引 中有討論。
註冊通訊協議處理程序的指導方針
註冊通訊協議處理程式時,您應該遵循下列指導方針:
- 安裝程序必須使用 EXE 或 MSI 安裝程式。
- 必須提供版本資訊。
- 必須為每個已安裝的外掛程式建立 [新增/移除程式] 專案。
- 安裝程式必須接管所有目前增益集瞭解的特定檔案類型或存儲的登錄設定。
- 如果覆寫先前的外掛程式,安裝程式必須通知使用者。
- 如果較新的附加元件已覆寫了先前的附加元件,應該可以還原先前附加元件的功能,並再次將其設為該檔案類型的預設附加元件。
- 安裝程式應該使用編目範圍管理員 (CSM) 來新增搜尋根目錄和範圍規則,以定義索引器的預設編目範圍。
註冊通訊協議處理程式
您需要在登錄建立十四個項目,才能註冊通訊協定處理程式元件,其中:
- Ver_Ind_ProgID 是通訊協定處理程序實作的版本獨立 ProgID。
- Ver_Dep_ProgID 是協議處理程序實作中與版本相關的 ProgID。
- CLSID_1 是通訊協定處理程序實作的CLSID。
若要註冊通訊協議處理程式:
使用下列鍵和值註冊與版本無關的程序 ID:
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CLSID (Default) = {CLSID_1}
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CurVer (Default) = <Ver_Dep_ProgID>
使用以下的鍵和值來註冊版本相關的 ProgID:
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> CLSID (Default) = {CLSID_1}
使用下列索引鍵和值註冊通訊協定處理程式的 CLSID:
HKEY_CLASSES_ROOT {CLSID_1} (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT {CLSID_1} {InprocServer32} (Default) = <DLL Install Path> Threading Model = Both
HKEY_CLASSES_ROOT {CLSID_1} <ProgID> (Default) = <Ver_Dep_ProgID>
HKEY_CLASSES_ROOT {CLSID_1} <ShellFolder> Attributes = dword:a0180000
HKEY_CLASSES_ROOT {CLSID_1} TypeLib (Default) = {LIBID of PH Component}
HKEY_CLASSES_ROOT {CLSID_1} VersionIndependentProgID (Default) = <Ver_Ind_ProgID>
向 Windows 搜尋註冊通訊協議處理程式。 在下列範例中,<通訊協定名稱> 是通訊協定本身的名稱,例如檔案、mapi 等等:
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
在 Windows Vista 之前:
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Desktop Search DS Index ProtocolHandlers <Protocol Name> HasRequirements = dword:00000000 HasStartPage = dword:00000000
註冊通訊協議處理程式的檔案類型處理程式
您需要在註冊表中新增兩個項目,才能註冊通訊協定處理程式的檔案類型處理程式(也稱為 Shell 擴充功能)。
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Desktop NameSpace {CLSID of PH Implementation} (Default) = <Shell Implementation Description>
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Shell Extensions Approved {CLSID of PH Implementation} = <Shell Implementation Description>
確保您的項目已編製索引
實作協定處理程序之後,您必須指定協定處理程式要編製索引的 Shell 項目。 您可以使用目錄管理員起始重新編製索引(如需詳細資訊,請參閱使用目錄管理員 )。 或者,您也可以使用編目範圍管理員 (CSM) 來設定預設規則,指出您希望索引器編目的 URL(如需詳細資訊,請參閱 使用編目範圍管理員 和 管理範圍規則)。 您也可以新增搜尋根目錄(如需詳細資訊,請參閱管理搜尋根目錄 )。 您可以選擇按 Windows 搜尋程式代碼範例中的 ReIndex 範例來執行相關程序。
ISearchCrawlScopeManager 介面提供方法,以通知搜尋引擎關於需抓取和/或監視的容器,以及在抓取或監視時要包含或排除的容器下的項目。 在 Windows 7 和更高版本中,ISearchCrawlScopeManager2 使用 ISearchCrawlScopeManager2::GetVersion 方法來延伸 ISearchCrawlScopeManager,該方法取得版本資訊,以告知用戶端 CSM 的狀態是否已變更。
相關主題