安裝與註冊通訊協定處理程式 (Windows 搜尋)
安裝通訊協議處理程式牽涉到將 DLL 複製到 Program Files 目錄中的適當位置,然後透過登錄註冊通訊協定處理程式。 安裝應用程式也可以新增搜尋根和範圍規則,以定義Shell數據源的預設編目範圍。
本主題的組織方式如下:
關於 URL
Windows 搜尋會使用 URL 來唯一識別殼層數據源階層中的專案。 階層中第一個節點的 URL 稱為 搜尋根目錄;Windows 搜尋會開始在搜尋根目錄編製索引,要求通訊協定處理程式列舉每個 URL 的子連結。
典型的 URL 結構為:
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
下表說明 URL 語法。
語法 | 描述 |
---|---|
<protocol> | 識別要叫用 URL 的通訊協定處理程式。 |
{user SID} | 識別呼叫通訊協議處理程式的使用者安全性內容。 如果未識別任何使用者安全性識別碼 (SID),則會在系統服務的安全性內容中呼叫通訊協定處理程式。 |
<path> | 定義存放區的階層,其中每個正斜線 ('/') 都是資料夾名稱之間的分隔符。 |
<ItemID> | 表示識別子專案的唯一字串(例如檔名)。 |
Windows 搜尋索引器會從 URL 修剪最終斜線。 因此,您無法依賴最終斜線的存在來識別目錄與專案。 您的通訊協議處理程式必須能夠處理此 URL 語法。 請確定您選取用來識別 Shell 數據源的通訊協定名稱不會與目前數據源衝突。 我們建議使用此命名慣例: companyName.scheme
。
如需建立Shell數據源的詳細資訊,請參閱 實作基本資料夾物件介面。
實作通訊協議處理程式介面
建立通訊協定處理程式需要實作下列三個介面:
- ISearchProtocol 來管理 UrlAccessor 物件。
- IUrlAccessor 可公開屬性,並識別殼層數據源中專案的適當篩選。
- IFilter 可篩選專屬檔案,或列舉和篩選階層式儲存的檔案。
除了列出的三個必要介面之外,其他介面是選擇性的,而且您可以自由地實作最適合手邊工作的選用介面。
ISearchProtocol 和 ISearchProtocol2
SearchProtocol 介面會初始化和管理通訊協定處理程式 UrlAccessor 物件。 ISearchProtocol2 介面是 ISearchProtocol 的選擇性延伸模組,並包含額外的方法來指定使用者和專案的詳細資訊。
IUrlAccessor、IUrlAccessor2、IUrlAccessor3 和 IUrlAccessor4
介面 | 描述 |
---|---|
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 介面的IFilter::GetChunk 和IFilter::GetValue 方法的迴圈;每個子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 Corporation。 著作權所有,並保留一切權利。
// 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。 通訊協議處理程式應該實作自我註冊以進行安裝。 安裝應用程式也可以新增搜尋根目錄和範圍規則,以定義殼層數據源的預設編目範圍,本主題結尾會討論 確保專案已編製 索引。
註冊通訊協議處理程序的指導方針
註冊通訊協議處理程式時,您應該遵循下列指導方針:
- 安裝程序必須使用 EXE 或 MSI 安裝程式。
- 必須提供版本資訊。
- 必須為每個已安裝的載入宏建立 [新增/移除程式] 專案。
- 安裝程式必須接管目前載入宏所瞭解之特定檔類型或儲存的所有登錄設定。
- 如果覆寫先前的載入宏,安裝程式應該通知使用者。
- 如果較新的載入宏已覆寫先前的載入宏,應該能夠還原先前載入宏的功能,並再次將它設為該檔類型的預設載入宏。
- 安裝程式應該使用編目範圍管理員 (CSM) 來新增搜尋根目錄和範圍規則,以定義索引器的預設編目範圍。
註冊通訊協議處理程式
您需要在登入建立十四個專案,才能註冊通訊協定處理程式元件,其中:
- Ver_Ind_ProgID是通訊協議處理程序實作的版本獨立 ProgID。
- Ver_Dep_ProgID是通訊協議處理程序實作的版本相依 ProgID。
- CLSID_1是通訊協定處理程序實作的CLSID。
若要註冊通訊協議處理程式:
使用下列索引鍵和值註冊與版本無關的 ProgID:
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
註冊通訊協議處理程式的檔類型處理程式
您需要在登錄中建立兩個專案,才能註冊通訊協定處理程式的檔類型處理程式(也稱為殼層延伸模組)。
-
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 方法擴充 ISearchCrawlScopeManager2::GetVersion 方法,以通知用戶端 CSM 的狀態是否已變更。
相關主題