Registrieren und Verteilen von Eigenschaftenhandlern

In diesem Thema wird erläutert, wie Sie Eigenschaftenhandler für die Arbeit mit dem Windows-Eigenschaftensystem erstellen und registrieren.

Dieses Thema ist wie folgt organisiert:

Registrieren und Verteilen von Eigenschaftenhandlern

Nachdem der Eigenschaftenhandler implementiert wurde, muss er registriert werden, und seine Dateinamenerweiterung muss dem Handler zugeordnet sein. Im folgenden Beispiel mit der Erweiterung .recipe werden die erforderlichen Registrierungseinträge veranschaulicht.

HKEY_CLASSES_ROOT
   CLSID
      {50d9450f-2a80-4f08-93b9-2eb526477d1a}
         (Default) = Recipe Property Handler
         ManualSafeSave [REG_DWORD] = 00000001
         InProcServer32
            (Default) = C:\\SDK\\PropertyHandlerSample\\bin\\RecipeHandlers.dll
            ThreadingModel = Apartment
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     .recipe
                        (Default) = {50d9450f-2a80-4f08-93b9-2eb526477d1a}

Eigenschaftenhandler für einen bestimmten Dateityp werden häufig mit den Anwendungen verteilt, die Dateien dieses Typs erstellen oder bearbeiten. Sie sollten jedoch auch in Erwägung ziehen, Ihre Eigenschaftshandler unabhängig von diesen Anwendungen verfügbar zu machen, um die Indizierung Ihres Dateityps in Serverszenarien zu unterstützen, in denen Eigenschaftenhandler vom Indexer verwendet werden, die zugehörigen Anwendungen jedoch nicht erforderlich sind. Wenn Sie ein eigenständiges Installationspaket für Ihren Eigenschaftenhandler erstellen, stellen Sie sicher, dass es Folgendes enthält:

  • Die Details zur Eigenschaftenhandlerregistrierung, die im Thema Registrieren und Verteilen von Eigenschaftenhandlern angegeben sind.
  • Registrierung für Ihren Dateityp und alle Schemadateien, die installiert werden müssen, damit Clients auf alle Features Ihres Eigenschaftenhandlers zugreifen können.

Leistungs- und Zuverlässigkeitsüberlegungen für Eigenschaftenhandler

Eigenschaftenhandler werden für jede Datei auf einem bestimmten Computer aufgerufen. Sie werden in der Regel unter folgenden Umständen genannt:

  • Während der Indizierung der Datei. Dies geschieht out-of-process, in einem isolierten Prozess mit eingeschränkten Rechten.
  • Wenn in Windows auf Dateien zugegriffen wird, Explorer zum Lesen und Schreiben von Eigenschaftswerten. Dies erfolgt prozessintern.

Richtlinien für Leistung und Zuverlässigkeit

Ein Benutzer kann jederzeit Zehntausende von Dateien eines bestimmten Typs (einschließlich Ihrer) auf seinen Computern haben und jederzeit auf eine oder alle diese Dateien zugreifen oder diese ändern. Da Eigenschaftshandler häufig aufgerufen werden, um diese Zugriffs- und Änderungsvorgänge zu unterstützen, sind die Leistungs- und Zuverlässigkeitsmerkmale Ihres Eigenschaftshandlers in stark gleichzeitigen Umgebungen von entscheidender Bedeutung.

Beachten Sie die folgenden Richtlinien, wenn Sie Ihren Eigenschaftenhandler entwickeln und testen.

  • Eigenschaftsaufzählung

    Eigenschaftenhandler sollten eine sehr schnelle Antwortzeit beim Auflisten ihrer Eigenschaften haben. Speicherintensive Berechnungen von Eigenschaftenwerten, Netzwerksuchen oder die Suche nach anderen Ressourcen als der Datei selbst sollten vermieden werden, um schnelle Antwortzeiten zu gewährleisten.

  • Direktes Schreiben von Eigenschaften

    Wenn es sich um mittelgroße oder große Dateien handelt (mehrere hundert KB oder größer), sollte das Dateiformat nach Möglichkeit so angeordnet werden, dass das Lesen oder Schreiben von Eigenschaftswerten nicht das Lesen der gesamten Datei vom Datenträger erfordert. Selbst wenn die Datei gesucht werden muss, sollte sie nicht vollständig in den Arbeitsspeicher eingelesen werden, da dies den Arbeitssatz von Windows Explorer oder den Windows Search-Indexer aufbläht, wenn sie versuchen, auf diese Dateien zuzugreifen oder diese zu indizieren. Weitere Informationen finden Sie unter Initialisieren von Eigenschaftenhandlern.

    Eine nützliche Technik, um dies zu erreichen, besteht darin, den Header der Datei mit zusätzlichem Speicherplatz zu unterbinden, sodass der Wert beim nächsten Schreiben eines Eigenschaftswerts geschrieben werden kann, ohne dass die gesamte Datei neu geschrieben werden muss. Dies erfordert die Funktion ManualSafeSave. Dieser Ansatz birgt ein gewisses zusätzliches Risiko, dass der Dateischreibvorgang unterbrochen wird, während der Schreibvorgang ausgeführt wird (aufgrund eines Systemabsturzes oder Eines Stromausfalls). Da die Eigenschaftengrößen in der Regel jedoch klein sind, ist die Wahrscheinlichkeit einer solchen Unterbrechung ähnlich gering, und die Leistungsgewinne, die durch direktes Schreiben von Eigenschaften erzielt werden können, werden als signifikant genug angesehen, um dieses zusätzliche Risiko zu rechtfertigen. Dennoch sollten Sie darauf achten, Ihre Implementierung ausführlich zu testen, um sicherzustellen, dass Ihre Dateien nicht beschädigt sind, falls im Verlauf eines Schreibvorgangs ein Fehler auftritt.

    Schließlich kann der Vorgang beim Implementieren des direkten Schreibens von Eigenschaften mit ManualSafeSave manchmal nicht an Ort und Stelle ausgeführt werden, und der gesamte Stream muss trotzdem neu geschrieben werden. Um das Umschreiben zu erleichtern, unterstützt der während der Handlerinitialisierung bereitgestellte Stream die IDestinationStreamFactory-Schnittstelle . Die IDestinationStreamFactory-Schnittstelle ermöglicht es Handlerimplementierungen, einen temporären Datenstrom zum Schreiben zu erhalten. wenn alle Schreibvorgänge abgeschlossen sind und die IDestinationStreamFactory::GetDestinationStream-Methode aufgerufen wird, wird dieser Stream verwendet, um den ursprünglichen Dateidatenstrom vollständig zu ersetzen. Wenn der Zielstream verwendet wird, sollte der ursprüngliche Dateidatenstrom als schreibgeschützt behandelt werden, da er durch den Zieldatenstrom ersetzt wird, nachdem die IDestinationStreamFactory::GetDestinationStream-Methode aufgerufen wurde.

  • Auswählen des COM-Threadingmodells

    Um die Effizienz Ihres Eigenschaftenhandlers zu maximieren, sollten Sie angeben, dass er das COM-Threadingmodell Bothverwendet. Dies ermöglicht den direkten Zugriff aus STA-Apartments (z. B. Windows Explorer) und Nachrichtenübertragungs-Agent-Apartments (MTA) (z. B. searchProtocolHost-Prozess in Windows Search), wodurch der Aufwand für Marshalling in diesen Umgebungen vermieden wird. Um den vollen Nutzen des Both Threadingmodells zu erzielen, sollten alle Dienste, von denen Ihr Handler abhängig ist, auch so festgelegt werden, dass Both in Aufrufen dieser Komponenten kein Marshalling ausgeführt wird. Überprüfen Sie die Dokumentation dieser speziellen Dienste, um zu überprüfen, ob sie dieses Threadingmodell verwenden.

  • Parallelität von Eigenschaftshandlern

    Eigenschaftenhandler und die IPropertyStore-Schnittstelle sind für seriellen zugriff und nicht für den gleichzeitigen Zugriff konzipiert. Windows Explorer, der Windows Search-Indexer und alle anderen Aufrufe von Eigenschaftenhandlern aus der Windows-Codebasis garantieren diese Nutzung. Es sollte keinen Grund für Dritte geben, einen Eigenschaftenhandler gleichzeitig zu verwenden, aber dieses Verhalten kann nicht garantiert werden. Auch wenn das aufrufende Muster als serielles Muster erwartet wird, können die Aufrufe auf verschiedenen Threads erfolgen (für instance, wenn das Objekt remote über COM RPC aufgerufen wird, wie im Indexer vorkommt). Daher müssen Eigenschaftenhandlerimplementierungen den Aufruf für verschiedene Threads unterstützen und sollten idealerweise keine nachteiligen Auswirkungen haben, wenn gleichzeitig aufgerufen wird. Da das beabsichtigte Aufrufmuster serial ist, sollte eine triviale Implementierung mit einem kritischen Abschnitt ausreichen, um diese Anforderungen in den meisten Fällen zu erfüllen. Es ist akzeptabel, das Blockieren gleichzeitiger Aufrufe zu vermeiden, indem Sie die TryEnterCriticalSection-Funktion verwenden, um gleichzeitige Aufrufe zu erkennen und fehlschlagen zu können.

  • Parallelität von Dateien

    Eigenschaftenhandler werden häufig in Szenarien verwendet, in denen mehrere Anwendungen gleichzeitig auf eine Datei zugreifen. Daher müssen der Handler und die Anwendungen die Parallelität verwalten, indem sie beim Öffnen der Datei geeignete Freigabemodi angeben. Sie müssen auch den Zugriff kennen, den die anderen Anwendungen angeben, und Fälle verwalten, in denen der Zugriff nicht zulässig ist. Es ist am besten, wenn alle Verbraucher liberale Freigabemodi angeben, damit andere gleichzeitig auf die Datei zugreifen können, aber dabei müssen Konsistenzprobleme verwaltet werden. Entscheidungen über die am besten geeigneten Freigabemodi, die verwendet werden sollen, müssen im Kontext der Community von Anwendungen getroffen werden, die auf die Datei zugreifen.

    Dateisysteme ermöglichen es Anwendungen, Dateien so zu öffnen, dass sie steuern können, ob und wie andere Anwendungen die Datei öffnen können. Freigabemodi ermöglichen Lese-, Schreib- und Löschzugriff. Das Eigenschaftensystem unterstützt eine Teilmenge dieser Freigabemodi, die in der folgenden Tabelle beschrieben sind.

    Zugriffsmodus Freigabemodus
    Schreiben Andere Leser und Autoren ablehnen
    Schreiben (EnableShareDenyWrite) Andere Leser aktivieren, andere Autoren ablehnen
    Schreibgeschützt (Standard) Andere Leser aktivieren, andere Autoren ablehnen
    Schreibgeschützt (EnableShareDenyNone) Andere Leser und Autoren aktivieren

     

    Eigenschaftenhandler, die zum Schreiben geöffnet sind (GPS_READWRITE), verweigern anderen Lesern und Autoren. Handler können sich für ein Verhalten entscheiden, das Lesern ermöglicht, indem sie das EnableShareDenyWrite Flag (imPlizieren von Lesen aktivieren) in der Registrierung angeben.

    Eigenschaftenhandler, die zum Lesen geöffnet sind (GPS_DEFAULT), ermöglichen standardmäßig andere Leser, verweigern jedoch andere Autoren. Handler können sich für die Aktivierung anderer Autoren entscheiden, indem sie das Flag in der EnableShareDenyNone Registrierung angeben. Dies bedeutet, dass ein Handler eine Situation erfolgreich behandeln kann, in der sich der Inhalt einer Datei ändert, während der Handler die Datei liest.

    Flagdefinitionen finden Sie unter GETPROPERTYSTOREFLAGS.

Grundlegendes zu Eigenschaftenhandlern

Verwenden von Kindnamen

Verwenden von Eigenschaftenlisten

Initialisieren von Eigenschaftenhandlern

Bewährte Methoden und häufig gestellte Fragen zu Eigenschaftenhandlern