Installieren und Registrieren von Protokollhandlern (Windows Search)
Die Installation eines Protokollhandlers umfasst das Kopieren der DLL(s) an einen geeigneten Speicherort im Verzeichnis Programme und das anschließende Registrieren des Protokollhandlers über die Registrierung. Die Installationsanwendung kann auch einen Suchstamm und Bereichsregeln hinzufügen, um einen Standarddurchforstungsbereich für die Shell-Datenquelle zu definieren.
Dieses Thema ist wie folgt organisiert:
- Informationen zu URLs
- Implementieren von Protokollhandlerschnittstellen
- Implementieren von Filterhandlern für Container
- Installieren und Registrieren eines Protokollhandlers
- Sicherstellen, dass Ihre Elemente indiziert sind
- Zugehörige Themen
Informationen zu URLs
Windows Die Suche verwendet URLs, um Elemente in der Hierarchie Ihrer Shell-Datenquelle eindeutig zu identifizieren. Die URL, die der erste Knoten in der Hierarchie ist, wird als Suchstamm bezeichnet. Windows Die Suche beginnt mit der Indizierung am Suchstamm und fordert an, dass der Protokollhandler untergeordnete Links für jede URL aufzählt.
Die typische URL-Struktur ist:
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
Die URL-Syntax wird in der folgenden Tabelle beschrieben.
| Syntax | BESCHREIBUNG |
|---|---|
| <protocol> | Gibt an, welcher Protokollhandler für die URL aufgerufen werden soll. |
| {Benutzer-SID} | Identifiziert den Benutzersicherheitskontext, unter dem der Protokollhandler aufgerufen wird. Wenn keine Benutzersicherheits-ID (SID) identifiziert wird, wird der Protokollhandler im Sicherheitskontext des Systemdiensts aufgerufen. |
| <path> | Definiert die Hierarchie des Speichers, wobei jeder Schrägstrich ('/') ein Trennzeichen zwischen Ordnernamen ist. |
| <Itemid> | Stellt eine eindeutige Zeichenfolge dar, die das untergeordnete Element identifiziert (z. B. den Dateinamen). |
Der Windows Search Indexer entfernt den letzten Schrägstrich aus URLs. Daher können Sie sich nicht darauf verlassen, dass ein letzter Schrägstrich vorhanden ist, um ein Verzeichnis im Vergleich zu einem Element zu identifizieren. Der Protokollhandler muss in der Lage sein, diese URL-Syntax zu verarbeiten. Stellen Sie sicher, dass der Protokollname, den Sie auswählen, um Ihre Shell-Datenquelle zu identifizieren, nicht mit dem aktuellen Namen in Konflikt steht. Es wird empfohlen, diese Benennungskonvention zu verwenden: companyName.scheme .
Weitere Informationen zum Erstellen einer Shell-Datenquelle finden Sie unter Implementing the Basic Folder Object Interfaces.
Implementieren von Protokollhandlerschnittstellen
Zum Erstellen eines Protokollhandlers ist die Implementierung der folgenden drei Schnittstellen erforderlich:
- ISearchProtocol zum Verwalten von UrlAccessor-Objekten.
- IUrlAccessor, um Eigenschaften verfügbar zu machen und geeignete Filter für Elemente in der Shell-Datenquelle zu identifizieren.
- IFilter zum Filtern proprietärer Dateien oder zum Aufzählen und Filtern hierarchisch gespeicherter Dateien.
Ab gegensatz zu den drei aufgeführten obligatorischen Schnittstellen sind die anderen Schnittstellen optional, und Sie sind bereit, die optionalen Schnittstellen zu implementieren, die für die entsprechende Aufgabe am besten geeignet sind.
ISearchProtocol und ISearchProtocol2
Die SearchProtocol-Schnittstellen initialisieren und verwalten Ihre UrlAccessor-Objekte des Protokollhandlers. Die ISearchProtocol2-Schnittstelle ist eine optionale Erweiterung von ISearchProtocolund enthält eine zusätzliche Methode, um weitere Informationen über den Benutzer und das Element anzugeben.
IUrlAccessor, IUrlAccessor2, IUrlAccessor3 und IUrlAccessor4
Die IUrlAccessor-Schnittstellen werden in der folgenden Tabelle beschrieben.
| Schnittstelle | Beschreibung |
|---|---|
| IUrlAccessor | Für eine angegebene URL bietet die IUrlAccessor-Schnittstelle Zugriff auf die Eigenschaften des Elements, das in der URL verfügbar gemacht wird. Sie kann diese Eigenschaften auch an einen protokollhandlerspezifischen Filter binden (d. h. einen anderen Filter als den, der dem Dateinamen zugeordnet ist). |
| IUrlAccessor2 (optional) | Die IUrlAccessor2-Schnittstelle erweitert IUrlAccessor um Methoden, die eine Codepage für die Eigenschaften und die Anzeige-URL des Elements erhalten und den Typ des Elements in der URL (Dokument oder Verzeichnis) erhalten. |
| IUrlAccessor3 (optional) | Die IUrlAccessor3-Schnittstelle erweitert IUrlAccessor2 um eine Methode, die ein Array von Benutzer-SIDs ruft, sodass der Suchprotokollhost die Identität dieser Benutzer zum Indizieren des Elements annimmt. |
| IUrlAccessor4 (optional) | Die IUrlAccessor4-Schnittstelle erweitert die Funktionalität der IUrlAccessor3-Schnittstelle um eine Methode, die identifiziert, ob der Inhalt des Elements indiziert werden soll. |
Das UrlAccessor-Objekt wird instanziiert und durch ein SearchProtocol-Objekt initialisiert. Die IUrlAccessor-Schnittstellen ermöglichen den Zugriff auf wichtige Informationen über die in der folgenden Tabelle beschriebenen Methoden.
| Methode | Beschreibung |
|---|---|
| IUrlAccessor::GetLastModified | Gibt den Zeitpunkt zurück, zu dem die URL zuletzt geändert wurde. Wenn diese Zeit aktueller ist als die letzte Verarbeitung dieser URL durch den Indexer, werden Filterhandler (Implementierungen der IFilter-Schnittstelle) aufgerufen, um die (möglicherweise) geänderten Daten für dieses Element zu extrahieren. Geänderte Zeiten für Verzeichnisse werden ignoriert. |
| IUrlAccessor::IsDirectory | Gibt an, ob die URL einen Ordner darstellt, der untergeordnete URLs enthält. |
| IUrlAccessor::BindToStream | Bindet an eine IStream-Schnittstelle, die die Daten einer Datei in einem benutzerdefinierten Datenspeicher darstellt. |
| IUrlAccessor::BindToFilter | Bindet an einen protokollhandlerspezifischen IFilter,der Eigenschaften für das Element verfügbar machen kann. |
| IUrlAccessor4::ShouldIndexItemContent | Gibt an, ob der Inhalt des Elements indiziert werden soll. |
IProtocolHandlerSite
Die IProtocolHandlerSite-Schnittstelle wird verwendet, um einen Filterhandler zu instanziieren, der in einem isolierten Prozess gehostet wird. Der entsprechende Filterhandler wird für einen angegebenen persistenten Klassenbezeichner (CLSID), eine Dokumentspeicherklasse oder eine Dateierweiterung ermittelt. Der Vorteil, dass der Hostprozess aufgefordert wird, eine Bindung an IFilter zu erstellen, ist, dass der Hostprozess den Prozess der Suche nach einem geeigneten Filterhandler verwalten und die Sicherheit steuern kann, die beim Aufrufen des Handlers beteiligt ist.
Implementieren von Filterhandlern für Container
Wenn Sie einen hierarchischen Protokollhandler implementieren, müssen Sie einen Filterhandler für einen Container implementieren, der untergeordnete URLs auflistet. Ein Filterhandler ist eine Implementierung der IFilter-Schnittstelle. Der Enumerationsprozess ist eine Schleife durch die Methoden IFilter::GetChunk und IFilter::GetValue der IFilter-Schnittstelle. Jede untergeordnete URL wird als Wert der -Eigenschaft verfügbar gemacht.
IFilter::GetChunk gibt die Eigenschaften des Containers zurück. Zum Auflisten untergeordneter URLs gibt IFilter::GetChunk einen der folgenden Punkte zurück:
-
Die URL zum Element ohne den Zeitpunkt der letzten Änderung. IFilter::GetValue gibt eine PROPVARIANT zurück, die die untergeordnete URL enthält.
PKEY _ Search _ UrlToIndexWithModificationTime:
Die URL und der Zeitpunkt der letzten Änderung. IFilter::GetValue gibt eine PROPVARIANT zurück, die einen Vektor der untergeordneten URL und den Zeitpunkt der letzten Änderung enthält.
Die Rückgabe der PKEY-Such-URLToIndexWithModificationTime _ _ ist effizienter, da der Indexer sofort bestimmen kann, ob das Element indiziert werden muss, ohne die Methoden ISearchProtocol::CreateAccessor und IUrlAccessor::GetLastModified auf aufruft.
Der folgende Beispielcode veranschaulicht, wie die Eigenschaft _ _ UrlToIndexWithModificationTime für die PKEY-Suche zurückgeben wird.
Wichtig
Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.
// 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;
}
Hinweis
Eine IFilter-Containerkomponente sollte immer alle untergeordneten URLs auflisten, auch wenn sich die untergeordneten URLs nicht geändert haben, da der Indexer Löschungen über den Enumerationsprozess erkennt. Wenn die Datumsausgabe in einer PKEY-Suche _ _ UrlToIndexWithModificationTime angibt, dass sich die Daten nicht geändert haben, aktualisiert der Indexer die Daten für diese URL nicht.
Installieren und Registrieren eines Protokollhandlers
Die Installation von Protokollhandlern umfasst das Kopieren der DLL(s) an einen geeigneten Speicherort im Verzeichnis Programme und das anschließende Registrieren der DLL(s). Protokollhandler sollten die Selbstregistrierung für die Installation implementieren. Die Installationsanwendung kann auch einen Suchstamm und Bereichsregeln hinzufügen, um einen Standarddurchforstungsbereich für die Shell-Datenquelle zu definieren. Dies wird am Ende dieses Themas unter Sicherstellen, dass Ihre Elemente indiziert werden erläutert.
Richtlinien für die Registrierung eines Protokollhandlers
Beim Registrieren eines Protokollhandlers sollten Sie die folgenden Richtlinien befolgen:
- Das Installationsprogramm muss entweder EXE- oder MSI-Installer verwenden.
- Versionshinweise müssen bereitgestellt werden.
- Für jedes installierte Add-In muss ein Eintrag zum Hinzufügen/Entfernen von Programmen erstellt werden.
- Das Installationsprogramm muss alle Registrierungseinstellungen für den jeweiligen Dateityp oder -speicher übernehmen, den das aktuelle Add-In versteht.
- Wenn ein vorheriges Add-In überschrieben wird, sollte das Installationsprogramm den Benutzer benachrichtigen.
- Wenn ein neueres Add-In das vorherige Add-In überschrieben hat, sollte es die Möglichkeit geben, die Funktionalität des vorherigen Add-Ins wiederherzustellen und es wieder zum Standard-Add-In für diesen Dateityp zu machen.
- Das Installationsprogramm sollte einen Standarddurchforstungsbereich für den Indexer definieren, indem ein Suchstamm und Bereichsregeln mithilfe der Durchforstungsbereich-Manager (CSM) hinzugefügt werden.
Registrieren eines Protokollhandlers
Sie müssen 14 Einträge in der Registrierung vornehmen, um die Protokollhandlerkomponente zu registrieren, wobei Folgendes gilt:
- Ver _ Ind _ ProgID ist die versionsunabhängige ProgID der Implementierung des Protokollhandlers.
- Ver _ Dep _ ProgID ist die versionsabhängige ProgID der Implementierung des Protokollhandlers.
- CLSID _ 1 ist die CLSID der Protokollhandlerimplementierungen.
So registrieren Sie einen Protokollhandler:
Registrieren Sie die versionsunabhängige ProgID mit den folgenden Schlüsseln und Werten:
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>Registrieren Sie die versionsabhängige ProgID mit den folgenden Schlüsseln und Werten:
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> (Default) = <Protocol Handler Class Description>HKEY_CLASSES_ROOT <Ver_Dep_ProgID> CLSID (Default) = {CLSID_1}Registrieren Sie die CLSID des Protokollhandlers mit den folgenden Schlüsseln und Werten:
HKEY_CLASSES_ROOT {CLSID_1} (Default) = <Protocol Handler Class Description>HKEY_CLASSES_ROOT {CLSID_1} {InprocServer32} (Default) = <DLL Install Path> Threading Model = BothHKEY_CLASSES_ROOT {CLSID_1} <ProgID> (Default) = <Ver_Dep_ProgID>HKEY_CLASSES_ROOT {CLSID_1} <ShellFolder> Attributes = dword:a0180000HKEY_CLASSES_ROOT {CLSID_1} TypeLib (Default) = {LIBID of PH Component}HKEY_CLASSES_ROOT {CLSID_1} VersionIndependentProgID (Default) = <Ver_Ind_ProgID>Registrieren Sie den Protokollhandler bei Windows Search. Im folgenden Beispiel ist der Name des Protokolls selbst, z. B. datei, mapi usw.:
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>Vor Windows Vista:
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Desktop Search DS Index ProtocolHandlers <Protocol Name> HasRequirements = dword:00000000 HasStartPage = dword:00000000
Registrieren des Dateityphandlers des Protokollhandlers
Sie müssen zwei Einträge in der Registrierung vornehmen, um den Dateityphandler des Protokollhandlers (der auch als Shellerweiterung bezeichnet wird) zu registrieren.
-
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>
Sicherstellen, dass Ihre Elemente indiziert sind
Nachdem Sie den Protokollhandler implementiert haben, müssen Sie angeben, welche Shellelemente ihr Protokollhandler indizieren soll. Sie können den Katalog-Manager verwenden, um eine erneute Indizierung zu initiieren (weitere Informationen finden Sie unter Verwenden des Katalog-Managers). Sie können auch die Durchforstungsbereich-Manager (CSM) verwenden, um Standardregeln einzurichten, die die URLs angeben, die der Indexer durchforsten soll (weitere Informationen finden Sie unter Verwenden der Durchforstungsbereich-Manager und Verwalten von Bereichsregeln). Sie können auch einen Suchstamm hinzufügen (weitere Informationen finden Sie unter Verwalten von Suchstämmen). Eine weitere Option, die Ihnen zur Verfügung steht, besteht darin, das Verfahren im ReIndex-Beispiel in Windows Search SDK Samples (SDK-Beispiele fürdie Suche) zu befolgen.
Die ISearchCrawlScopeManager-Schnittstelle stellt Methoden bereit, die die Suchmaschine über Container informieren, die durchforstet und/oder überwacht werden sollen, sowie Elemente unter diesen Containern, die beim Durchforsten oder Beobachten eingeschlossen oder ausgeschlossen werden sollen. In Windows 7 und höher erweitert ISearchCrawlScopeManager2 ISearchCrawlScopeManager um die ISearchCrawlScopeManager2::GetVersion-Methode, die die Version erhält, die Clients darüber informiert, ob sich der Zustand des CSM geändert hat.
Zugehörige Themen
-
Konzeptionellen