Windows-Shell-Integration heute — Kontextmenüs, Dateizuordnungen und Windows 11

· Aktualisiert am: · · Windows, Shell-Erweiterungen, Kontextmenü, Dateizuordnung, COM, Windows 11, Datei-Explorer, MSIX, Windows-Entwicklung

Änderungsverlauf (Erstfassung, veröffentlicht am 20. Aug 2026)
Erstveröffentlichung
Diesen Artikel zitieren(DOI (registriertes Archiv): 10.5281/zenodo.22176250)

Die folgenden DOIs verweisen auf bereits archivierte Versionen, die vom aktuellen Text abweichen können. Verwenden Sie die URL dieser Seite, um auf den aktuellen Text zu verweisen.

Go Komura (2026). Windows-Shell-Integration heute — Kontextmenüs, Dateizuordnungen und Windows 11. KomuraSoft LLC. https://comcomponent.com/de/blog/windows-shell-integration-context-menu-file-association/

DOI (registriertes Archiv)
10.5281/zenodo.22176250
DOI (zuletzt registrierte Version)
10.5281/zenodo.22176251

„Nach dem Wechsel auf Windows 11 ist das Kontextmenü unserer App nicht mehr zu finden.“ Beim Nachsehen ist der Eintrag nicht verschwunden: Er erscheint, sobald man am Ende des Menüs „Weitere Optionen anzeigen“ öffnet. Das ist kein Defekt, sondern die von Windows 11 geänderte Menügestaltung. Vor Ort führt das zu Anfragen wie „ein Klick mehr“ oder „der Eintrag ist nicht zu finden“.

Allerdings sind „eine Datei mit dieser App öffnen“ und „einen eigenen Befehl im neuen Kontextmenü zeigen“ getrennte Aufgaben. Wer das nicht trennt und sofort eine Shell-Erweiterungs-DLL schreibt, macht auch Anforderungen kompliziert, die nur eine Zuordnungsregistrierung brauchen.

Dieser Artikel ist eine Einführung für IT-Verantwortliche in kleinen und mittleren Unternehmen und für Windows-Entwickler, die Geschäftsanwendungen betreuen. Er verbindet die Grundlage der Zuordnung, den Unterschied der alten und neuen Menüs, die Wahl der Implementierung, Registrierung und Entfernung im Installer sowie die Eingrenzung von Störungen.

1. Zuerst das Fazit

Die Grundlage von Zuordnung und Verb ist unverändert; unter Windows 11 hat sich nur die Darstellung des Menüs in alt und neu geteilt. Legen Sie zuerst fest, was Sie erreichen wollen, und wählen Sie nur den dafür nötigen Mechanismus.

Wenn es nur um „Öffnen“ geht, von Zuordnung und statischem Verb ausgehen

Die Grundlage der Dateizuordnung ist die dreistufige Registrierungsstruktur Erweiterungsschlüssel → ProgID → Verb. Der Erweiterungsschlüssel zeigt auf die ProgID, und shell\<verb>\command unter der ProgID hält die zu startende Befehlszeile. Wer nur „mit dieser App öffnen“ will, kommt weiterhin mit dieser Registrierung und einem statischen Verb aus; eine Shell-Erweiterungs-DLL ist unnötig. Microsoft rät ebenfalls, zuerst das einfachste statische Verb zu prüfen, das die Anforderung erfüllt.12

Das Ziel der Registrierung ist HKLM für alle Benutzer, HKCU je Benutzer. HKCR ist eine zusammengeführte Sicht der jeweiligen Classes, daher schreibt man ausdrücklich nach HKLM oder HKCU und behandelt HKCR als Prüfmittel.3

Zudem sind die Registrierung als Kandidat und die Wahl zur Standard-App getrennt. Die Standard-App für den Doppelklick wählt der Benutzer, und das OS schützt diese Wahl. Der Installer soll die Vorgabe nicht selbst übernehmen, sondern bis zur korrekten Kandidatenregistrierung gehen.4

Eigene Befehle im neuen Menü brauchen IExplorerCommand und Paketidentität

Unter Windows 11 weichen klassische IContextMenu-Erweiterungen ins alte Menü aus, das mit „Weitere Optionen anzeigen“ (Umschalt+F10) geöffnet wird. Um eigene Befehle im neuen Menü zu zeigen, braucht es eine IExplorerCommand-Implementierung und Paketidentität.56

Der offizielle Weg ist, eine native DLL mit IExplorerCommand im MSIX-Manifest (desktop4:FileExplorerContextMenus) zu registrieren. Lässt sich die vorhandene App nicht vollständig auf MSIX umstellen, gibt ein Sparse-Paket (MSIX mit externem Speicherort) nur die Identität.67

Sicherheit der DLL und Aufräumen bei der Deinstallation mitdenken

Eine klassische Shell-Erweiterung ist eine COM-DLL, die in den Prozess von Explorer und anderen geladen wird. Absturz oder Verzögerung der Erweiterung greifen auf den ganzen Host über. Ein 64-Bit-Host braucht eine 64-Bit-DLL; In-Process-Erweiterungen in verwaltetem Code werden nicht unterstützt.89

Nach Registrierung, Änderung oder Löschung einer Zuordnung benachrichtigen Sie mit SHChangeNotify(SHCNE_ASSOCCHANGED). Bei der Deinstallation löschen Sie die eigene ProgID und Ähnliches und lassen den Standardwert des Erweiterungsschlüssels; das ist die offizielle Anleitung. Shell-Integration heißt nicht nur, das Menü zu zeigen, sondern Änderung sichtbar zu machen und aufzuräumen.110

Lesen nach Ziel

Was Sie wissen wollen oder welches Symptom vorliegt Wo lesen
Welche Implementierung zu wählen ist Entscheidungstabelle in Kapitel 6. Trennen Sie reine Zuordnung und eigene Befehle im neuen Menü
Doppelklick oder „Öffnen mit“ unterstützen Zuordnung in Kapitel 2 und statische Verben in Kapitel 3
Registriert, aber nicht Standard-App UserChoice in 2.4. Trennen Sie Kandidatenregistrierung und Benutzerwahl
Unter Windows 11 liegt das Menü eine Ebene tiefer Alte und neue Menüs in Kapitel 5. Vorgehen in 5.2, ohne volle MSIX-Umstellung in 5.3
Was der Installer registrieren und entfernen soll Kapitel 7. Besonders Registrierung je Benutzer in 7.3 und Aufräumen in 7.4
Menü fehlt, erscheint doppelt, Explorer ist langsam Eingrenzung in Kapitel 8. DLL-Grenzen in Kapitel 4

Wer den Mechanismus lernen will, liest ab Kapitel 2; wer die Linie für eine vorhandene App festlegen will, ab Kapitel 6.

In der Abbildung kennzeichnet eine durchgezogene Linie eine stets geltende Beziehung und eine gestrichelte Linie eine bedingte (die Bedingungen stehen bei jeder Beziehung auf der Detailseite). Die vollständige Liste der Beziehungen (16 insgesamt, mit Beleg und Sicherheitsgrad) und die Definitionen der wichtigsten Konzepte sind auf der Detailseite der Wissenskarte (auf Japanisch) zusammengestellt. Daten: JSON-LD / Turtle

2. Mechanik der Dateizuordnung — dreistufig: Erweiterungsschlüssel → ProgID → Verb

Dieses Kapitel ordnet Dateiregistrierung → Schreibziel → App-Registrierung → Benutzerwahl. Dass die Erweiterung auf die ProgID zeigt, das Verb die Befehlszeile hält und aufwendigere Erweiterungen als In-Process-COM-DLL laufen, ist seit über zwanzig Jahren die Grundlage.

2.1. Die drei Stufen an einem Beispiel lesen

Zuerst die Grundform der Zuordnung an einem Beispiel. Der Erweiterungsschlüssel zeigt auf die ProgID, das Verb darin hält den zu startenden Befehl.1 Die Vorrangregel, wenn der Benutzer eine Standard-App gewählt hat, steht in 2.4.

HKEY_CLASSES_ROOT
   .kmrpt                                  ← (1) Erweiterungsschlüssel
      (Default) = KomuraSoft.Report.1      ←     nur Zeiger auf die ProgID
      OpenWithProgids
         KomuraSoft.Report.1               ←     Kandidat unter „Öffnen mit“
   KomuraSoft.Report.1                     ← (2) ProgID (Substanz der Zuordnung)
      (Default) = KomuraSoft-Bericht
      DefaultIcon
         (Default) = "C:\Program Files\KomuraSoft\Report.exe",0
      shell                                ← (3) Liste der Verben
         open
            command
               (Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
  • (1) Der Erweiterungsschlüssel (.kmrpt) zeigt im Standardwert nur auf den ProgID-Namen. Direkt hier einen Befehl zu schreiben ist falsch.
  • (2) Die ProgID (KomuraSoft.Report.1) ist die Substanz der Zuordnung und hält Anzeigename, Symbol und Verb-Liste.
  • (3) Das Verb ist die Handlung wie „Öffnen“ oder „Drucken“; der Standardwert von shell\open\command ist die tatsächlich gestartete Befehlszeile.

Diese Trennung erlaubt, mehrere Erweiterungen (.kmrpt und .kmrpt-file etwa) auf dieselbe ProgID zu zeigen oder bei einem Versionswechsel die ProgID auszutauschen.

Dreistufige Struktur der DateizuordnungDer Erweiterungsschlüssel ist nur ein Zeiger, dessen Standardwert auf die ProgID zeigt; die ProgID hält Anzeigename, Symbol und Verb-Liste; der Standardwert von command unter dem Verb ist die tatsächlich gestartete BefehlszeileStandardwert zeigt auf die ProgIDErweiterungsschlüssel .kmrptProgID KomuraSoft.Report.1Verb (open unter shell und so weiter)Standardwert von commandReport.exe wird gestartetHält auch Anzeigename und DefaultIcon

Abbildung 1: Der Erweiterungsschlüssel ist der Zeiger, die ProgID die Substanz, command des Verbs die tatsächlich gestartete Befehlszeile.

2.2. HKCR ist eine zusammengeführte Sicht — wohin Sie schreiben, ändert die Bedeutung

Das Beispiel oben steht unter HKEY_CLASSES_ROOT (HKCR), aber HKCR ist kein physischer Speicherort, sondern eine zusammengeführte Sicht von HKLM\Software\Classes und HKCU\Software\Classes. Liegt derselbe Schlüssel in beiden, gewinnt HKCU.3

HKCR ist eine zusammengeführte SichtHKCR überlagert die jeweiligen Classes von HKLM und HKCU; liegt derselbe Schlüssel in beiden, hat HKCU Vorrang; Registrierungen schreibt man ausdrücklich nach HKLM oder HKCU und behandelt HKCR als nur lesendHKLM\\Software\\Classes (alle Benutzer)HKCR (zusammengeführte Sicht)HKCU\\Software\\Classes (je Benutzer)Derselbe Schlüssel: HKCU gewinntAls nur lesend (zur Prüfung) behandeln

Abbildung 2: HKCR ist die überlagerte Sicht der Classes von HKLM und HKCU; das Schreibziel muss immer eines der beiden sein.

Schreibziel Bedeutung Nötige Rechte
HKLM\Software\Classes Registrierung für alle Benutzer Administratorrechte
HKCU\Software\Classes Registrierung nur für diesen Benutzer Nicht nötig
Direkt nach HKCR Wird je nach Ort des vorhandenen Schlüssels verteilt Je nach Fall

In der Praxis ist es sicher, Registrierungen ausdrücklich nach HKLM oder HKCU zu schreiben und HKCR als nur lesend (zur Prüfung) zu behandeln.

Zuordnungsdaten und die Bittigkeit der COM-Registrierung nicht vermengen

Bei der WOW64-Registrierungsumleitung unterscheiden sich Zuordnungsdaten und COM-Registrierung. Zuordnungsdaten direkt unter HKLM\Software\Classes wie Erweiterungsschlüssel und ProgID sind seit Windows 7 zwischen 32-Bit- und 64-Bit-Registrierungssicht geteilt; ein 32-Bit-Installer entweicht nicht nach Wow6432Node.

Dagegen sind einige Unterschlüssel der COM-Registrierung wie Classes\CLSID Umleitungsziele; bei der später behandelten Shell-Erweiterung (In-Process-COM) wirkt die getrennte 32-/64-Bit-Schreibweise. Details in „Fallstricke der 32-/64-Bit-Registrierungsumleitung und -virtualisierung“.

2.3. Registrierung auf der App-Seite — App Paths, Applications, RegisteredApplications

Zur Dateiseite (Erweiterung und ProgID) gehören drei Arten der App-Registrierung.11

  • App Paths (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths): Registrierung, damit der Start allein über den EXE-Namen mit ShellExecuteEx gelingt. Die PATH-Umgebungsvariable bleibt unberührt; Microsoft empfiehlt diesen Weg.
  • Applications (HKCR\Applications\<App.exe>): Definiert die Standardöffnung, wenn unter „Öffnen mit“ eine beliebige Datei übergeben wird, und den Anzeigenamen der App (FriendlyAppName).
  • RegisteredApplications + Capabilities: Erklärt, welche Erweiterungen und MIME-Typen die App behandelt, und lässt sie als Kandidat in den Windows-Einstellungen für Standard-Apps erscheinen.

Die meisten Anfragen „unsere App fehlt in der Liste der Standard-Apps“ kommen daher, dass die ProgID registriert ist, diese Capabilities-Registrierung aber fehlt.

Drei Arten der Registrierung auf der App-SeiteAuf der App-Seite gibt es App Paths, Applications und RegisteredApplications; sie dienen dem Start allein über den Dateinamen, der Standardöffnung unter Öffnen mit und dem Erscheinen in den Einstellungen für Standard-AppsRegistrierung auf der App-SeiteApp PathsApplicationsRegisteredApplicationsStart allein über den DateinamenStandard unter Öffnen mitErscheint unter Standard-AppsBedingung: Erklärung in Capabilities

Abbildung 3: Die App-Seite hat drei Registrierungen; als Kandidat unter Standard-Apps braucht es die Capabilities-Registrierung.

2.4. Die Standard-App gehört dem Benutzer — Schutz von UserChoice

Einen ProgID-Namen in den Standardwert des Erweiterungsschlüssels zu schreiben macht noch nicht die Standard-App. Das Ergebnis einer ausdrücklichen Wahl unter „Öffnen mit“ und Ähnlichem liegt in HKCU\...\Explorer\FileExts\<Erweiterung>\UserChoice und hat bei der Auflösung der Zuordnung Vorrang.

UserChoice nicht direkt umschreiben

Windows unterstützt die programmgesteuerte Änderung der Standard-App nicht. Die Einstellung der Standard-App trifft der Benutzer über die Systemeinstellungen-UI; die UserChoice-Daten sind verschleiert, und der Filtertreiber (UCPD.sys) blockiert Schreibzugriffe von Apps. In verwalteten Umgebungen sind Gruppenrichtlinie und MDM die offiziellen Mittel.4

Dass Werkzeuge wie SetUserFTA den Hash nachahmten und umschrieben, ist die Kehrseite dieses Schutzes.

Der Installer bereitet vor, gewählt zu werden

In den Installer der eigenen App gehören diese drei Punkte.

  1. ProgID und Verb korrekt registrieren.
  2. Zu OpenWithProgIds hinzufügen.
  3. Bei Bedarf den Benutzer zu den Einstellungen für Standard-Apps führen.

Die Vorgabe wird nicht übernommen; der Benutzer soll wählen können.

Auflösung der Standard-App und Schutz von UserChoiceDas ausdrücklich gewählte Ergebnis des Benutzers liegt in UserChoice und hat bei der Auflösung der Zuordnung Vorrang; Umschreiben durch Apps blockiert UCPD.sys, daher bleibt dem Installer die Kandidatenregistrierung und die Führung zur EinstellungsseiteVorrangUCPD.sys blockiertUserChoice (Wahl des Benutzers)Auflösung der ZuordnungStandardwert des ErweiterungsschlüsselsUmschreiben durch die AppAufgabe des InstallersRegistrierung von ProgID und VerbHinzufügen zu OpenWithProgIdsFührung zur Einstellungsseite

Abbildung 4: Bei der Auflösung der Zuordnung hat die Benutzerwahl (UserChoice) Vorrang; Umschreiben durch Apps schützt das OS.

3. Verben außer „Öffnen“ — print, edit, runas, eigene Verben

3.1. Standardverben und eigene Verben

Es gibt nicht nur open. Standardverben, deren Bedeutung das OS kennt, sind neben open etwa edit, print, play, preview; Standardverben erhalten automatisch einen Anzeigenamen je nach OS-Gebietsschema. Das Standardverb beim Doppelklick ergibt sich in der Reihenfolge Standardwert des shell-Schlüssels → erstes Verb in der Registrierung → open → openwith.12

Reihenfolge, in der das Standardverb feststehtDas Standardverb beim Doppelklick ist das erste gefundene aus Standardwert des shell-Schlüssels, erstem Verb in der Registrierung, open, openwithsonstsonstsonstStandardwert des shell-SchlüsselsErstes Verb in der Registrierungopenopenwith

Abbildung 5: Beim Doppelklick gilt das erste in dieser Reihenfolge gefundene Standardverb.

Ein eigenes Verb registrieren Sie so.

KomuraSoft.Report.1
   shell
      open
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
      print
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" /print "%1"
      verify                          ← eigenes Verb
         (Default) = Bericht prüfen(&V)   ← Anzeigename im Menü
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" /verify "%1"

3.2. Erhöhung, Anzeige bei Umschalt und altes DDE trennen

Verben kennen außerdem folgende Angaben.

  • Ein Verb runas definiert den erhöhten Start entsprechend „Als Administrator ausführen“ und dient auch Starts über ShellExecute-APIs mit runas.
  • Ein leerer Wert Extended am Verb-Schlüssel macht ein erweitertes Verb, das nur bei Rechtsklick mit gedrückter Umschalttaste erscheint. Nützlich, um selten genutzte, riskante Vorgänge zu verbergen.12
  • In Zuordnungen alter Apps kann DDE (ddeexec) ein Dokument an einen vorhandenen Prozess senden; der Verb-Start über DDE ist bereits veraltet (Deprecated). Es gibt keinen Grund, ihn neu zu schreiben.12

3.3. EXE-Pfad und Pfad der gewählten Datei in Anführungszeichen setzen

Häufige Unfälle betreffen Anführungszeichen in der Befehlszeile. Enthält ein Element der Befehlszeichenfolge Leerzeichen, müssen Anführungszeichen her. Das gilt für EXE-Pfade wie C:\Program Files\... und %1 (Pfad der gewählten Datei) sollte immer "%1" sein. Dass der Dateipfad des Benutzers keine Leerzeichen enthält, ist nicht garantiert. Ein My Program.exe ohne Anführungszeichen wird als Start von My mit Argument Program.exe gelesen.13

Unfall mit Anführungszeichen in der BefehlszeileEin Befehl ohne Anführungszeichen wird an Leerzeichen getrennt und fälschlich als Start von My mit Argument Program.exe gelesen; EXE-Pfad und %1 für den Pfad der gewählten Datei daher immer in AnführungszeichenTrennung am Leerzeichencommand ohne AnführungszeichenFalsch als andere EXE gelesencommand mit AnführungszeichenStart wie vorgesehenEXE-Pfad in Anführungszeichenauch %1 immer in Anführungszeichen

Abbildung 6: Ein Befehl ohne Anführungszeichen wird am Leerzeichen falsch getrennt; EXE-Pfad und %1 daher immer in Anführungszeichen.

3.4. Vor dem Schreiben einer DLL prüfen, ob ein statisches Verb reicht

Die bisherige, nur aus der Registrierung bestehende Mechanik (statisches Verb) braucht keine DLL und gefährdet den Explorer nicht. Microsoft selbst wiederholt, vor dem Schreiben einer Shell-Erweiterung zu prüfen, ob das einfachste statische Verb die Anforderung erfüllt.2

4. Klassische Shell-Erweiterungen — DLLs, die im Explorer laufen

Was dieses Kapitel festhält: eine klassische Erweiterungs-DLL läuft im Prozess von Explorer und anderen. Wer den Ort versteht, verbindet Stabilität, Bittigkeit und Sprache.

4.1. Arten von Shell-Erweiterungen

Anforderungen, die ein statisches Verb nicht erfüllt — Menü dynamisch nach Auswahl, Austausch von Symbol oder Eigenschaftenseite — brauchen Shell-Erweiterungshandler. Typische Arten:8

Handler Wichtige Schnittstelle Was er kann
Kontextmenühandler IContextMenu + IShellExtInit Menüeinträge dynamisch hinzufügen und steuern
Symbolhandler / Symbolüberlagerung IExtractIcon / IShellIconOverlayIdentifier Symbol je Datei, Überlagerung
Eigenschaftenseitenhandler IShellPropSheetExt Registerkarte in den Eigenschaften
Miniaturansicht / Infotipp IThumbnailProvider / IQueryInfo Verkleinerte Ansicht, Erklärung beim Zeigen
Drag & Drop / Kopierhook IDropTarget / ICopyHook Eingriff bei Ablegen, Kopieren, Verschieben

Alle werden als COM-Klasse implementiert und mit CLSID in der Registrierung eingetragen. Die COM-Idee selbst erklärt „Was sind COM, ActiveX und OCX?“.

4.2. Was ein In-Process-COM-Server bedeutet

Das Wesen der klassischen Shell-Erweiterung ist ein In-Process-COM-Server (DLL), der in den Prozess des Explorers (und jeder App, die den gemeinsamen Dateidialog öffnet) geladen wird. Daraus folgen alle Vorbehalte.8

  • Stürzt die Erweiterung ab, stürzt der Explorer mit ab. Hängt sie, friert der Rechtsklick Sekunden ein. Der Schaden bleibt nicht beim Explorer; er trifft jede App, die einen Dateidialog zeigt.
  • Der Menüaufbau läuft auf dem UI-Thread; langsame Arbeit wie Netz- oder Datei-E/A darf beim Anzeigen des Menüs nicht laufen.
  • Das Threading-Modell wird grundsätzlich als Apartment registriert.
Mitgerissen-Struktur der In-Process-ErweiterungDie Shell-Erweiterungs-DLL wird nicht nur in den Explorer, sondern in den Prozess jeder App geladen, die einen Dateidialog öffnet; Absturz oder Hängen der Erweiterung greifen daher auf den ganzen Hostprozess überLaden in den ProzessLaden in den ProzessShell-Erweiterungs-DLLExplorerBeliebige App mit DateidialogAbsturz oder Hängen greifen überKeine langsame Arbeit beim Anzeigen

Abbildung 7: Die Erweiterungs-DLL läuft im Hostprozess; Absturz oder Hängen greifen auf den ganzen Host über.

Untersucht man „in einem bestimmten Ordner friert der Explorer ein“ oder „der Rechtsklick dauert fünf Sekunden“, ist die Ursache oft nicht die eigene App, sondern eine Shell-Erweiterung eines Drittanbieters. Die Eingrenzung steht in Kapitel 8.

4.3. Übereinstimmung der Bittigkeit — in 64-Bit-Umgebungen ist eine 64-Bit-DLL zwingend

Eine In-Process-DLL muss dieselbe Bittigkeit haben wie der ladende Prozess. Der Explorer auf 64-Bit-Windows ist ein 64-Bit-Prozess; eine nur als 32-Bit gebaute Shell-Erweiterungs-DLL wird gar nicht geladen und erscheint nie im Menü. Es gibt keinen Fehler; das ist ein Klassiker von „registriert, erscheint aber nicht“.

Die App selbst muss nicht 64-Bit werden

Die Kombination 32-Bit-App und 64-Bit-Shell-Erweiterungs-DLL ist zulässig; die COM-Registrierung teilt sich jedoch nach Bittigkeit (Wow6432Node). Der Start über command eines Verbs ist eine andere Prozess-EXE und unterliegt dieser Grenze nicht (32-Bit-EXE bleibt in Ordnung).

Übereinstimmung der Bittigkeit der Shell-Erweiterungs-DLLIn den 64-Bit-Explorer lässt sich nur eine 64-Bit-Shell-Erweiterungs-DLL laden; eine nur-32-Bit-DLL erscheint ohne Fehler nicht im Menü; eine über command eines Verbs gestartete EXE ist ein anderer Prozess und unterliegt der Grenze nichtlädtlädt nichtanderer Prozess64-Bit-Explorer64-Bit-Shell-Erweiterungs-DLLNur-32-Bit-DLLErscheint ohne Fehler nicht im MenüEXE, die das Verb startet32-Bit bleibt in Ordnung

Abbildung 8: In den 64-Bit-Explorer wird nur eine 64-Bit-DLL geladen; eine über das Verb gestartete EXE unterliegt dieser Grenze nicht.

4.4. Warum man sie nicht in verwaltetem Code schreiben soll

Die Frage „kann man eine Shell-Erweiterung in C# schreiben?“ kommt oft; Microsoft rät von In-Process-Shell-Erweiterungen in verwaltetem Code (.NET) ab und stellt sie ausdrücklich außerhalb des Supports.9

Der Grund liegt darin, dass die Erweiterung in beliebige Prozesse geladen wird. Die Host-App wird vor allem durch drei Faktoren instabil.

  • CLR-Versionskollision. Besonders unter .NET Framework unter 4.
  • Wiedereintritt. Beim Warten auf Sperren tritt die CLR in die Nachrichtenschleife ein.
  • Objektlebensdauer. Die nicht deterministische Lebensdauer durch Garbage Collection kollidiert mit dem COM-Referenzzählvertrag.

Manche Punkte sind ab .NET Framework 4 und modernem .NET gemildert; die offizielle Haltung ist unverändert.

Die praktische Linie ist einfach. In-Process-Erweiterungen in nativem C++ schreiben. Wer verwalteten Code will, macht eine normale EXE, die das Verb startet, oder eine Out-of-Process-Erweiterung in einem eigenen Prozess (Vorschauhandler und Ähnliches).9

Entscheidung, ob verwalteter Code zulässig istIn-Process-Erweiterungen im Explorer-Prozess schreibt man grundsätzlich in nativem C++; verwalteter Code kommt für eine normale EXE, die das Verb startet, oder eine Out-of-Process-Erweiterung in einem eigenen Prozess in FrageJaNeinErweiterung im Prozess?In nativem C++ schreibenVerwalteter Code zulässigCLR-Kollision oder Wiedereintritt macht den Host instabilNormale EXE, die das Verb startetOut-of-Process-Erweiterung, etwa Vorschau

Abbildung 9: In-Process-Erweiterungen sind grundsätzlich natives C++; verwalteter Code bleibt Konfigurationen in einem anderen Prozess vorbehalten.

5. Das neue Kontextmenü unter Windows 11 — Verdopplung des Menüs

Hier der Ablauf warum es ins alte Menü wanderte → Registrierung im neuen Menü → vorhandenen Installer behalten. Den Unterschied zwischen reiner Zuordnung „mit dieser App öffnen“ und dem Hinzufügen eigener Befehle klärt 5.4.

5.1. Was geschehen ist

Windows 11 hat das Kontextmenü des Explorers erneuert. Ausschneiden, Kopieren und Ähnliches stehen oben als Symbolleiste, „Öffnen“ und „Öffnen mit“ sind oben zusammengefasst, von Apps hinzugefügte Befehle werden unter den Shell-Standardbefehlen gruppiert. Fügt eine App mehrere Befehle hinzu, landen sie in einem Flyout (Untermenü) mit App-Namen.5

Der entscheidende Punkt: Klassische IContextMenu-basierte Shell-Erweiterungen wurden nicht gelöscht, sondern ins alte Menü verschoben, das mit „Weitere Optionen anzeigen“ (Umschalt+F10) das Windows-10-Menü unverändert lädt.5 Das „versteckte Menü“ der Eingangsanfrage ist diese Verdopplung.

Unter Windows 11 verdoppeltes KontextmenüBeim Rechtsklick öffnet sich zuerst das neue Menü; dort erscheinen nur mit IExplorerCommand und Paketidentität registrierte Befehle; klassische IContextMenu-Erweiterungen weichen ins alte Menü aus, das über Weitere Optionen anzeigen geöffnet wirdWeitere Optionen anzeigen Umschalt+F10Rechtsklick auf eine DateiNeues Menü (Windows 11)Befehle mit IExplorerCommand und IdentitätAltes Menü (Windows-10-Menü)Klassische IContextMenu-ErweiterungMehrere Befehle im Flyout gebündelt

Abbildung 10: Im neuen Menü erscheinen nur Befehle mit IExplorerCommand und Identität; klassische Erweiterungen weichen ins alte Menü aus.

5.2. Offizieller Weg ins neue Menü — IExplorerCommand plus Manifestregistrierung

Der offizielle Weg, eigene Befehle im neuen Menü zu zeigen, ist eine native DLL mit IExplorerCommand und die Registrierung im MSIX-Manifest.6

Im Manifest zwei Erklärungen schreiben

Das folgende Beispiel erklärt in der ersten Hälfte den COM-Server (CLSID und Implementierungs-DLL) und in der zweiten die Kontextmenüerweiterung (Ziel und Befehl). Dieselbe CLSID verbindet beide.

<!-- Paketmanifest (Auszug) -->
<com:Extension Category="windows.comServer">
  <com:ComServer>
    <com:SurrogateServer DisplayName="Komura commands">
      <com:Class Id="01234567-89AB-CDEF-0123-456789ABCDEF"
                 Path="KomuraCommand.dll" ThreadingModel="STA" />
    </com:SurrogateServer>
  </com:ComServer>
</com:Extension>
<desktop4:Extension Category="windows.fileExplorerContextMenus">
  <desktop4:FileExplorerContextMenus>
    <desktop5:ItemType Type=".kmrpt">
      <desktop5:Verb Id="VerifyReport"
                     Clsid="01234567-89AB-CDEF-0123-456789ABCDEF" />
    </desktop5:ItemType>
  </desktop4:FileExplorerContextMenus>
</desktop4:Extension>

Type von ItemType kann eine bestimmte Erweiterung sein, außerdem * (alle Dateien), Directory (Ordner), Directory\Background (Hintergrund eines Ordners). Die DLL muss zur Architektur des Explorers (64-Bit/ARM64) passen.6

Methoden zum Menüaufbau schnell zurückkehren lassen

IExplorerCommand selbst gibt es seit Windows 7; implementiert werden Titel (GetTitle), Symbol (GetIcon), Zustand aktiv/inaktiv/ausgeblendet (GetState) und Ausführen (Invoke). Die Methoden kommen vom UI-Thread; Zugriff auf Netzressourcen ist verboten, und Methoden zum Menüaufbau müssen schnell zurückkehren. Schwere Arbeit folgt nach Invoke.146

Manifeststruktur der Registrierung im neuen MenüDie COM-Server-Erklärung im MSIX-Manifest ordnet CLSID und DLL zu, die Erklärung der Kontextmenüerweiterung verbindet Ziel und Implementierung über ItemType und Verb, und der eigene Befehl erscheint im neuen MenüCLSID und DLL zuordnenüber ItemType und Verb angebenMSIX-ManifestCOM-Server-ErklärungErklärung der MenüerweiterungIExplorerCommand-Implementierungs-DLLBefehl im neuen MenüZiel ist Erweiterung oder alle Dateien und so weiter

Abbildung 11: Zwei Erklärungen im Manifest verbinden Implementierungs-DLL und Ziel, und der Befehl erscheint im neuen Menü.

5.3. Option für nicht verpackte Apps — nur Identität über ein Sparse-Paket

Der Ausweg bei „unsere App lässt sich nur als MSI verteilen, MSIX geht nicht“ ist ein Sparse-Paket (MSIX mit externem Speicherort). Ein kleines, nur aus dem Manifest bestehendes, signiertes MSIX ohne App-Dateien wird am Ende des vorhandenen Installers registriert. Die App erhält Paketidentität und kann die obige Manifestregistrierung (Anzeige im neuen Menü) nutzen.

Verfügbar ab Windows 10 Version 2004; das Paket braucht eine Signatur mit einem auf dem Zielrechner vertrauenswürdigen Zertifikat.7 Reihenfolge von Registrierung und Entfernung sowie der Vorbehalt, dass die Registrierung je Benutzer gilt, stehen in 7.3.

Ablauf, Identität über ein Sparse-Paket zu erhaltenNachdem der vorhandene Installer die App-Dateien abgelegt hat, registriert ein nur aus dem Manifest bestehendes Sparse-Paket mit externem Speicherort die App, sie erhält Paketidentität, und die Manifestregistrierung im neuen Menü wird möglichVorhandener InstallerApp-Dateien ablegenSparse-PaketNur Manifest, keine App-DateienMit externem Speicherort registrierenPaketidentität erhaltenRegistrierung im neuen Menü möglichVertrauenswürdige Signatur nötig

Abbildung 12: Ein Sparse-Paket ohne App-Dateien, mit externem Speicherort registriert, gibt der App Paketidentität.

Der größte Vorteil ist, den Installer nicht ersetzen zu müssen; das ist die realistische Lösung für Apps mit vorhandenem MSI/EXE-Installer. Der Vergleich mit der vollständigen MSIX-Umstellung steht in „Wahl der Verteilung von Windows-Apps“.

5.4. Wie Zuordnungs-Verben im neuen Menü erscheinen

Ein häufiger Irrtum: Die Zuordnung aus Kapitel 2 und 3 (ProgID und Verb) gilt auch im neuen Menü. Standardverb beim Doppelklick, „Öffnen“ und die Kandidaten unter „Öffnen mit“ werden aus der Zuordnung aufgelöst und oben im neuen Menü gezeigt. Wer nur „mit dieser App öffnen“ will, braucht unter Windows 11 keine zusätzliche Arbeit.

Andererseits ist die Zuordnung keine allgemeine Menüerweiterung; beliebige eigene Befehle in der ersten Ebene des neuen Menüs brauchen IExplorerCommand plus Identität. Das ist die Arbeitsteilung.6

Arbeitsteilung von Zuordnung und neuem MenüDie Zuordnung aus ProgID und Verb dient auch im neuen Menü der Auflösung von Standardverb, Öffnen und Öffnen mit und erscheint oben; beliebige eigene Befehle in der ersten Ebene des neuen Menüs brauchen IExplorerCommand und IdentitätZuordnung (ProgID und Verb)Auflösung von Standardverb und ÖffnenOben im neuen MenüUnter Windows 11 keine ZusatzarbeitBeliebiger eigener BefehlIExplorerCommand plus IdentitätErste Ebene des neuen Menüs

Abbildung 13: Die Zuordnung löst auch im neuen Menü „Öffnen“; nur eigene Befehle brauchen IExplorerCommand plus Identität.

6. Entscheidungstabelle für die Praxis — welche der drei Optionen

Prüfen Sie zuerst, ob (a) reicht; eigene Befehle im neuen Menü brauchen (b). Vorhandene klassische Erweiterungen vorerst zu halten ist (c).

Was Sie erreichen wollen Empfohlenes Mittel Erscheinungsbild unter Windows 11 Nötige Arbeit und Kosten
(a) Die eigene App per Doppelklick oder „Öffnen“ starten Zuordnung plus statisches Verb (nur Registrierung) Im neuen Menü unter „Öffnen“ und „Öffnen mit“ integriert Nur Registrierung im Installer. Keine DLL, keine zusätzliche Signaturanforderung
(b) Eigene Befehle für gewählte Dateien oder Ordner im neuen Menü IExplorerCommand plus MSIX-Manifestregistrierung. Nicht verpackte Apps erhalten Identität über ein Sparse-Paket Erste Ebene des neuen Menüs (mehrere Befehle im Flyout mit App-Namen) Native C++-DLL plus Paketidentität plus Codesignatur
(c) Vorhandene klassische IContextMenu-Erweiterung weiter nutzen Vorerst halten (nicht für neue Entwicklung wählen) Nur im alten Menü unter „Weitere Optionen anzeigen“ (Umschalt+F10) 64-Bit-Build und COM-Registrierung halten. Später Migration nach (b) planen

Entscheidung 1: Das einfachste Mittel wählen, das die Anforderung erfüllt

Anforderungen, die (a) erfüllen, nicht mit (b) oder (c) belasten, steht an erster Stelle. Eine Shell-Erweiterung übernimmt vom Schreiben an die Verantwortung für die Stabilität des Explorers.

Entscheidung 2: Halten des alten Menüs und Verbesserung der Bedienung trennen

(c) heißt nur „nicht kaputt“; das Benutzererlebnis bleibt eine Ebene schlechter. Je häufiger der Befehl im Alltag ist, desto größer der Nutzen einer Migration nach (b).

Wahl unter den drei OptionenReicht Start per Doppelklick oder Öffnen, genügen Zuordnung und statisches Verb; eigene Befehle im neuen Menü brauchen IExplorerCommand und MSIX-Manifestregistrierung, ohne volle MSIX-Umstellung Identität über ein Sparse-Paket; vorhandene klassische IContextMenu-Erweiterungen bleiben vorerst im alten MenüJaNeinJaJaNeinNeinReicht Öffnen?Zuordnung plus statisches VerbEigene Befehle im neuen Menü?MSIX-Umstellung möglich?IExplorerCommand plus MSIXIdentität über Sparse-PaketKlassische Erweiterung vorerst haltenNur im alten MenüKeine DLL, geringes Risiko

Abbildung 14: Je nach Anforderung unter statischem Verb, IExplorerCommand plus Identität und Halten der klassischen Erweiterung wählen.

7. Praxis von Ausbringung und Registrierung — Installer, Sparse-Paket, Aufräumen

Ist die Implementierung gewählt, gehören Schreibziel, Änderungsbenachrichtigung, Paketregistrierung und -entfernung sowie Aufräumen bei der Deinstallation in den Installer.

7.1. HKLM oder HKCU

Das Schreibziel folgt der Form des Installers. Für alle Benutzer (Ablage unter Program Files, Administratorrechte) HKLM\Software\Classes, bei Installation je Benutzer (ohne Erhöhung) HKCU\Software\Classes. Mischen erzeugt Anfragen vom Typ „bei A öffnet es, bei B nicht“.

Bei Shell-Erweiterungen mit CLSID-Registrierung kann Reg-Free COM die Registrierung innerhalb der App überflüssig machen, gilt aber nicht für vom Explorer geladene Shell-Erweiterungen; dort braucht es die reguläre Registrierung („Was ist Reg-Free COM?“).

7.2. Nach Änderung benachrichtigen — SHChangeNotify

Nach Registrierung, Änderung oder Löschung einer Zuordnung benachrichtigen Sie mit SHChangeNotify das Ereignis SHCNE_ASSOCCHANGED. Fehlt das, erkennt der Explorer die Änderung manchmal erst nach einem Neustart.110

// Nach einer Zuordnungsänderung einmal aufrufen, etwa in einer Custom Action des Installers
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);

7.3. Registrierung und Entfernung des Sparse-Pakets

Registrierung und Entfernung des Sparse-Pakets sind Aufgabe des Installers. Registrieren nach dem Ablegen der Dateien, entfernen vor dem Löschen.7

# Bei der Installation: nach dem Ablegen der Dateien den Installationsort als externen Speicherort registrieren
Add-AppxPackage -Path "C:\Program Files\KomuraSoft\KomuraReport.identity.msix" `
                -ExternalLocation "C:\Program Files\KomuraSoft"

# Bei der Deinstallation: die Paketregistrierung entfernen, bevor die Dateien gelöscht werden
Remove-AppxPackage <Paketvollname>

Registrierung für den ausführenden Benutzer und Ausbringung für alle Benutzer trennen

Add-AppxPackage registriert für den Benutzer, der es ausgeführt hat. Läuft es aus einer Custom Action eines Per-Machine-MSI unter LocalSystem, erhält der installierende Benutzer keine Identität; daher unter Identitätswechsel (Impersonation) ausführen.

Allerdings gilt auch die Registrierung unter Identitätswechsel nur für den Benutzer, der diese Installation ausgeführt hat. Nutzen mehrere Benutzer denselben PC, haben andere und später angelegte Benutzer keine Paketidentität, und der Befehl erscheint nicht im neuen Menü.

Sollen alle Benutzer ihn nutzen, prüfen Sie beim ersten Start der App die eigene Paketregistrierung und registrieren bei Bedarf — Registrierung je Benutzer. Die Deinstallation plant das Entfernen bei jedem Benutzer mit Registrierung ein.

Wenn das Menü nach der Registrierung nicht erscheint

Das Wirksamwerden einer Manifestregistrierung kann einen Explorer-Neustart (oder Abmeldung) brauchen.6

Reihenfolge von Registrierung und Entfernung eines Sparse-PaketsBei der Installation das Sparse-Paket nach dem Ablegen der Dateien registrieren, bei der Deinstallation die Registrierung vor dem Löschen der Dateien entfernen; die Registrierung gilt nur für den ausführenden BenutzerInstallationDateien ablegenSparse-Paket registrierenDeinstallationPaketregistrierung entfernenDateien löschenRegistrierung gilt nur für den ausführenden Benutzer

Abbildung 15: Registrieren nach dem Ablegen der Dateien, entfernen vor dem Löschen; die Registrierung gilt je ausführendem Benutzer.

7.4. Aufräumen bei der Deinstallation — was löschen und was lassen

Für das Aufräumen bei der Deinstallation gibt die offizielle Anleitung eine klare Linie.1

  • Löschen: den ganzen eigenen ProgID-Schlüssel, Capabilities-/RegisteredApplications-Registrierung, CLSID-Registrierung der Shell-Erweiterung, Sparse-Paket (Remove-AppxPackage).
  • Lassen: den Standardwert des Erweiterungsschlüssels (.kmrpt). Die offizielle Empfehlung ist, ihn nicht zu löschen, selbst wenn er noch auf die eigene ProgID zeigt. Nach der Installation zu beurteilen, ob eine andere App die Vorgabe übernommen hat, ist schwierig, und Windows ignoriert eine nicht registrierte Standardwert-ProgID, sodass das Lassen keinen echten Schaden anrichtet.
  • Am Ende des Aufräumens ebenfalls SHChangeNotify(SHCNE_ASSOCCHANGED) aufrufen.

Die meisten Probleme „deinstalliert, und Reste erscheinen noch im Menü“ sind Lücken in diesem Aufräumen.

Entwurf des Aufräumens bei der DeinstallationBei der Deinstallation eigene ProgID- und CLSID-Registrierung sowie Sparse-Paket löschen, den Standardwert des Erweiterungsschlüssels lassen, weil eine nicht registrierte ProgID ignoriert wird, und am Ende mit SHChangeNotify benachrichtigenDeinstallationLöschenLassenProgID- und CLSID-RegistrierungSparse-PaketStandardwert des ErweiterungsschlüsselsEine nicht registrierte ProgID wird ignoriertAm Ende mit SHChangeNotify benachrichtigen

Abbildung 16: Eigene Registrierung löschen, Standardwert des Erweiterungsschlüssels lassen, am Ende die Änderung benachrichtigen.

8. Fehlerbehebung — fehlt, doppelt, langsam

Störungen untersucht man getrennt nach „erscheint nicht“, „erscheint doppelt oder bleibt“ und „langsam oder stürzt ab“. Zuletzt, wie Registrierung und Aufräumen in einer sauberen Umgebung zu prüfen sind.

8.1. Erscheint nicht im Menü

Zuerst klären, welches Menü Sie ansehen, alt oder neu. Dann in dieser Reihenfolge eingrenzen.

  1. Welches Menü: Eine Registrierung im klassischen Stil erscheint nur im alten Menü unter Umschalt+F10. Zuerst beide prüfen.
  2. Bittigkeit: Eine nur-32-Bit-Shell-Erweiterungs-DLL wird nicht in den 64-Bit-Explorer geladen (4.3).
  3. Schreibziel: HKLM/HKCU, Verwechslung mit Wow6432Node. Den tatsächlichen Schlüssel mit reg query prüfen.
  4. Paketregistrierung: Für das neue Menü Vorhandensein mit Get-AppxPackage, Vertrauen des Signaturzertifikats und Pfad von -ExternalLocation prüfen, dann den Explorer neu starten.6
  5. Vergessene Benachrichtigung: Fehlt SHChangeNotify, erkennt man das daran, ob ein Explorer-Neustart es wirksam macht.
Reihenfolge der Eingrenzung, wenn es nicht im Menü erscheintZuerst klären, welches Menü Sie ansehen, dann Bittigkeit der DLL, Schreibziel in der Registrierung, Paketregistrierung und Signatur, vergessenes SHChangeNotifyKlären, alt oder neuBittigkeit der DLL prüfenSchreibziel HKLM und HKCU prüfenPaketregistrierung und Signatur prüfenVergessene Benachrichtigung am Neustart erkennen

Abbildung 17: Bei „erscheint nicht“ in der Reihenfolge angesehenes Menü, Bittigkeit, Schreibziel, Paketregistrierung, vergessene Benachrichtigung eingrenzen.

8.2. Erscheint doppelt oder bleibt

Zuerst in welchem Menü die Doppelung liegt.

  • Nur im alten Menü doppelt: Lücken beim Aufräumen der Deinstallation (7.4) oder Reste einer alten ProgID.
  • In alt und neu: Koexistenz klassischer Registrierungsregistrierung und MSIX-Manifestregistrierung.

Beides sind typische Eingrenzungen; urteilen Sie nach dem tatsächlichen Registrierungsinhalt.

Eingrenzung der DoppelanzeigeNur im alten Menü doppelt deutet auf Reste wie Aufräumen-Lücke oder alte ProgID; in alt und neu auf Koexistenz klassischer Registrierung und ManifestregistrierungNur altes MenüAlt und neuWo doppelt?ResteKoexistenzAufräumen-Lücke oder alte ProgIDKlassische Registrierung und neue Registrierung nebeneinander

Abbildung 18: Nur im alten Menü doppelt spricht für Reste, in alt und neu für Koexistenz.

8.3. Explorer ist langsam oder stürzt ab

Ist der Rechtsklick langsam oder stürzt ein bestimmter Ordner ab, zuerst die installierten Shell-Erweiterungen aufnehmen.

  1. Erweiterungen auflisten. Mit einem Werkzeug wie NirSoft ShellExView Nicht-Microsoft-Erweiterungen prüfen.
  2. Vorübergehend deaktivieren und eingrenzen. Verdächtige per binärer Suche, die verursachende DLL finden. Bei Absturz ist das „fehlerhafte Modul“ in der Ereignisanzeige ein Hinweis.
  3. Bei eigener Erweiterung den Menüaufbaupfad prüfen. Synchrone E/A oder Netzzugriff verdächtigen (4.2 und 5.2).
Verursachende DLL finden bei langsam oder AbsturzMit ShellExView Nicht-Microsoft-Shell-Erweiterungen auflisten, Verdächtige vorübergehend deaktivieren und per binärer Suche die verursachende DLL finden; bei Absturz auch das fehlerhafte Modul in der EreignisanzeigeBestandsaufnahme der Shell-ErweiterungenNicht-Microsoft auflistenVorübergehend deaktivieren, binäre SucheVerursachende DLL findenBei AbsturzFehlerhaftes Modul prüfen

Abbildung 19: Nicht-Microsoft-Erweiterungen vorübergehend deaktivieren und per binärer Suche eingrenzen; bei Absturz die Ereignisanzeige nutzen.

8.4. Zur Prüfung eignet sich Windows Sandbox

Die Grundprüfung der Shell-Integration ist „in sauberer Umgebung installieren → Verhalten → deinstallieren → keine Reste“. Dafür eignet sich Windows Sandbox (Pro/Enterprise/Education): Bei jedem Start steht in Sekunden ein unbenutztes Wegwerf-Windows bereit, sodass Registrierung und Aufräumen des Installers beliebig oft laufen. Beim Schließen verschwindet alles; das passt auch zur Suche nach Registrierungsresten.15

9. Zusammenfassung

Heißt es nach dem Wechsel auf Windows 11, „das Menü ist versteckt“, prüfen Sie zuerst in der Entscheidungstabelle in Kapitel 6, was Sie erreichen wollen. Die Überlegung hat drei Stufen.

1. Entscheiden, ob die Zuordnung reicht

Reicht „mit dieser App öffnen“, genügen Zuordnung und statisches Verb weiterhin. Die Grundlage ist Erweiterungsschlüssel → ProgID → Verb; HKCR ist die zur Prüfung bestimmte, überlagerte Sicht der Classes von HKLM und HKCU. Das Schreibziel ausdrücklich setzen, %1 immer in Anführungszeichen.

Die Standard-App wählt jedoch der Benutzer. Der Installer übernimmt die Vorgabe nicht, sondern registriert korrekt als Kandidat.

2. Entscheiden, in welchem Menü eigene Befehle erscheinen

Klassische IContextMenu-Erweiterungen laufen im alten Menü unter „Weitere Optionen anzeigen“. Eigene Befehle im neuen Menü brauchen IExplorerCommand und die Registrierung im MSIX-Manifest. Apps ohne vollständige MSIX-Umstellung erhalten Paketidentität über ein Sparse-Paket; das ist die realistische Lösung.

Die DLL einer klassischen Erweiterung läuft im Prozess von Explorer und anderen. Absturz oder Verzögerung greifen auf den ganzen Host über; ein 64-Bit-Host braucht eine 64-Bit-DLL. In-Process-Erweiterungen in verwaltetem Code werden nicht unterstützt; natives C++ ist die Regel.

3. Registrierung, Änderungsbenachrichtigung und Entfernung als Satz prüfen

Nach Registrierung, Änderung oder Löschung einer Zuordnung mit SHChangeNotify benachrichtigen. Bei der Deinstallation eigene ProgID und Ähnliches löschen, den Standardwert des Erweiterungsschlüssels lassen. Das Sparse-Paket gilt je Benutzer; in Umgebungen mit mehreren Benutzern gehören Registrierung und Entfernung je Benutzer in den Plan.

Mit Windows Sandbox in sauberer Umgebung installieren → Verhalten → deinstallieren → Reste prüfen, wiederholt.

Vom einfachsten Mittel ausgehen und nur bei Bedarf eigene Befehle im neuen Menü hinzufügen. Diese Reihenfolge klärt Umfang der Arbeit und welche Registrierung und Implementierung zu halten sind.

Verwandte Artikel

Verwandte Beratungsbereiche

KomuraSoft LLC übernimmt Entwurf und Implementierung von Dateizuordnung, Kontextmenü und Shell-Erweiterung für Geschäftsanwendungen, die Anpassung an das neue Kontextmenü unter Windows 11 (IExplorerCommand, Einführung eines Sparse-Pakets), die Überprüfung von Registrierung und Aufräumen vorhandener Installer sowie die Untersuchung, warum der Explorer langsam ist oder abstürzt. Schon bei der Linie „was tun mit dem unter Weitere Optionen anzeigen versteckten Menü?“ zu beginnen ist in Ordnung.

Quellen

  1. Microsoft Learn, File Types. Die Struktur, in der der Erweiterungsschlüssel auf die ProgID zeigt, OpenWithProgIds, die Wahl zwischen HKLM/HKCU\Software\Classes, dass nach einer Zuordnungsänderung SHChangeNotify(SHCNE_ASSOCCHANGED) aufzurufen ist, und dass bei der Deinstallation die ProgID gelöscht, der Standardwert des Erweiterungsschlüssels aber belassen werden soll. ↩ ↩2 ↩3 ↩4 ↩5

  2. Microsoft Learn, Choosing a Static or Dynamic Shortcut Menu Method. Dass das einfachste statische Verb zu wählen ist, das die Anforderung erfüllt, IContextMenu am mächtigsten, aber am komplexesten und eher nicht empfohlen ist, und IExplorerCommand/IExplorerCommandState der empfohlene Weg ist. ↩ ↩2

  3. Microsoft Learn, HKEY_CLASSES_ROOT Key. Dass HKEY_CLASSES_ROOT eine zusammengeführte Sicht von HKLM\Software\Classes und HKCU\Software\Classes ist, dass Benutzerdefinitionen Vorrang vor Maschinendefinitionen haben, und die Verteilungsregel beim Schreiben. ↩ ↩2

  4. Microsoft Learn, Windows app defaults platform. Dass die Änderung der Standard-App nur über die Systemeinstellungen-UI vorgesehen ist, Benutzerdaten verschleiert und durch den Filtertreiber (UCPD.sys) schreibgeschützt sind, registrierungsbasierte Änderung nicht unterstützt wird, und in verwalteten Umgebungen Gruppenrichtlinie/MDM zu nutzen ist. ↩ ↩2

  5. Windows Developer Blog, Extending the Context Menu and Share Dialog in Windows 11. Entwurf des neuen Windows-11-Kontextmenüs, Erweiterung über IExplorerCommand plus App-Identität, Platzierung von „Öffnen“ und „Öffnen mit“ oben, Bündelung mehrerer Befehle im Flyout mit App-Namen, und dass klassische IContextMenu-Erweiterungen als Windows-10-Menü unter „Weitere Optionen anzeigen“ (Umschalt+F10) geladen werden. ↩ ↩2 ↩3

  6. Microsoft Learn, Add a File Explorer context menu command to a packaged desktop app. Dass die Registrierung im neuen Windows-11-Kontextmenü über IExplorerCommand plus Manifesterklärungen windows.comServer und desktop4:FileExplorerContextMenus erfolgt, ItemType * , Directory und Directory\Background annehmen kann, die DLL-Architektur übereinstimmen muss, Methoden zum Menüaufbau schnell bleiben sollen, nicht verpackte Apps über ein Sparse-Paket, dass ein Explorer-Neustart nötig sein kann, und dass die Dateizuordnung keine allgemeine Menüerweiterung ist. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  7. Microsoft Learn, Grant package identity by packaging with external location. Dass ohne Änderung des vorhandenen Installers ein Paket mit externem Speicherort (Sparse-Paket) registriert werden kann und Paketidentität ergibt, verfügbar ab Windows 10 Version 2004, und dass identitätspflichtige Windows-Funktionen (Kontextmenüregistrierung, Benachrichtigungen und so weiter) nutzbar werden. ↩ ↩2 ↩3

  8. Microsoft Learn, Working with Shell Extensions. Arten von Shell-Erweiterungshandlern, dass die Erweiterung eine In-Process-COM-DLL ist, die in den Explorer (und Prozesse, die die Shell hosten) geladen wird, Absturz oder Hängen den ganzen Explorer treffen, Registrierung mit ThreadingModel=Apartment, und dass einfachere Alternativen zur Shell-Erweiterung zuerst zu prüfen sind. ↩ ↩2 ↩3

  9. Microsoft Learn, Guidance for Implementing In-Process Extensions. Dass Microsoft In-Process-Shell-Erweiterungen in verwaltetem Code nicht empfiehlt und nicht unterstützt, Gründe wie CLR-Versionskollision, Wiedereintritt und nicht deterministische Objektlebensdauer, und dass verwalteter Code bei Out-of-Process-Erweiterungen (Vorschauhandler oder Start über shell\verb\command) zulässig ist. ↩ ↩2 ↩3

  10. Microsoft Learn, SHChangeNotify function. Wie das Ereignis SHCNE_ASSOCCHANGED eine Dateizuordnungsänderung dem System mitteilt, und wie die Shell die Änderung erkennt. ↩ ↩2

  11. Microsoft Learn, Application Registration. Dass die Registrierung der EXE über den Unterschlüssel App Paths empfohlen wird, die Rolle des Unterschlüssels Applications, Verb-Registrierung über SystemFileAssociations, und die Vorrangregel von ProgID und zugehörigen Informationen beim Wechsel der Standard-App. ↩

  12. Microsoft Learn, Creating Shortcut Menu Handlers. Registrierung statischer Verben, Reihenfolge des Standardverbs (Standardwert → erstes Verb → Open → Open With), dass Anzeigenamen von Standardverben das OS liefert, erweiterte Verben über Extended, dass die Zuordnung über DDE-Befehle veraltet (Deprecated) ist, und Vorbehalte der WOW64-Umleitung in 64-Bit-Umgebungen. ↩ ↩2 ↩3

  13. Microsoft Learn, Verbs and File Associations. Dass ein Verb auch von ShellExecuteEx genutzt wird, Elemente der Befehlszeichenfolge mit möglichen Leerzeichen in Anführungszeichen gehören und “%1” immer mit Anführungszeichen zu schreiben ist, und die Registrierung der Standardprozedur unter HKCR\Applications. ↩

  14. Microsoft Learn, IExplorerCommand interface. Methodenaufbau einschließlich GetTitle, GetIcon, GetState, Invoke, EnumSubCommands, dass Methoden auf dem UI-Thread aufgerufen werden und daher nicht mit Netzressourcen sprechen dürfen, und Verfügbarkeit ab Windows Vista. ↩

  15. Microsoft Learn, Windows Sandbox. Dass eine wegwerfbare, isolierte Windows-Umgebung in Sekunden startet und beim Schließen alle Änderungen verwirft, sich für Softwaretests und Installer-Prüfung eignet, und unter Pro/Enterprise/Education verfügbar ist. ↩

Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.

Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.

Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.

Häufige Fragen

Fragen, die in Beratungen zu diesem Artikelthema häufig gestellt werden.

Warum erscheint der Kontextmenüeintrag unserer App unter Windows 11 nur unter „Weitere Optionen anzeigen“?
Weil unter Windows 11 das Kontextmenü des Datei-Explorers in zwei Schichten zerfallen ist, alt und neu. Im neuen Menü erscheinen nur Befehle, die die Schnittstelle IExplorerCommand implementieren und in einem MSIX-Paketmanifest registriert sind, also eine Paketidentität haben. Klassische IContextMenu-basierte Shell-Erweiterungen wurden ins alte Menü verschoben, das Sie mit „Weitere Optionen anzeigen“ (Umschalt+F10) öffnen. Die Erweiterung selbst ist nicht kaputt und funktioniert vorerst weiter, aber wenn Sie sie im neuen Menü wollen, brauchen Sie eine Migration zu IExplorerCommand und entweder die Verpackung als MSIX oder die Vergabe der Identität mit einem Sparse-Paket.
Kann das Installationsprogramm unsere App als Standard-App für eine Datei festlegen, die beim Doppelklick öffnet?
Nein. Die Wahl der Standard-App ist so entworfen, dass sie der Benutzer trifft, und Windows unterstützt das Ändern der Standard-App von nirgendwo sonst als der Systemeinstellungen-UI. Die UserChoice-Informationen, die die Wahl jedes Benutzers halten, sind verschleiert, und ein Filtertreiber (UCPD.sys) schützt sie zusätzlich schreibend vor Apps. Was ein Installationsprogramm tun kann, ist, eine ProgID und Verben zu registrieren, sich zu OpenWithProgIds hinzuzufügen, damit es als Kandidat unter „Öffnen mit“ erscheint, und den Benutzer zur Seite Standard-Apps zu lenken. Die korrekte Implementierung ist nicht, die Vorgabe zu stehlen, sondern bereit zu sein, gewählt zu werden.
Darf ich eine Shell-Erweiterung in verwaltetem Code wie C# schreiben?
Microsoft hat klar gesagt, dass das Schreiben einer In-Process-Shell-Erweiterung (eines Kontextmenühandlers, eines Symbolhandlers und Ähnlichem) in verwaltetem Code nicht empfohlen und nicht unterstützt wird. Die Erweiterung wird in den Explorer und in den Prozess jeder App geladen, die einen gemeinsamen Dateidialog öffnet, sodass CLR-Versionskollisionen, Wiedereintritt und nicht deterministische Objektlebensdauer die Host-App instabil machen. Die Regel ist eine Implementierung in nativem C++. Eine normale EXE, die von einem Verb-Command gestartet wird, oder eine Out-of-Process-Erweiterung wie ein Vorschauhandler, der in einem eigenen Prozess läuft, ist in verwaltetem Code in Ordnung.
Was ist ein Sparse-Paket (MSIX mit externem Speicherort)?
Ein kleines MSIX-Paket, das keine App-Dateien enthält, nur ein Manifest (Identitätsinformationen). Für eine App, die auf gewöhnliche Weise mit einem vorhandenen Installationsprogramm (MSI, Inno Setup und Ähnliches) installiert wird, registrieren Sie es mit Add-AppxPackage -ExternalLocation auf den Installationsordner, und die App erwirbt Paketidentität und kann Funktionen nutzen, die Identität erfordern, etwa die Registrierung im neuen Windows-11-Kontextmenü und Toastbenachrichtigungen. Es ist ab Windows 10 Version 2004 verfügbar, und das Paket braucht eine Codesignatur, der auf dem Zielrechner vertraut wird. Es ist die realistische Option, wenn Sie die neue Menüunterstützung wollen, ohne die gesamte Verteilung auf MSIX umzustellen.
Was soll ich tun, wenn ein Kontextmenüeintrag doppelt erscheint oder nicht verschwindet?
Isolieren Sie zuerst die Ursache, indem Sie prüfen, auf welchem Menü er erscheint: dem neuen oder dem alten (Weitere Optionen anzeigen). Die typische Doppelanzeige ist, dass eine klassische Registrierungsregistrierung und eine MSIX-Manifestregistrierung koexistieren, oder dass eine ProgID- oder Erweiterungs-CLSID-Registrierung bei der Deinstallation zurückgeblieben ist. Nach dem Ändern von Zuordnungen verdächtigen Sie auch ein vergessenes SHChangeNotify(SHCNE_ASSOCCHANGED); direkt nach der Paketregistrierung ein vergessenes Explorer-Neustart. Wenn das immer noch nicht löst, deaktivieren Sie vorübergehend Nicht-Microsoft-Erweiterungen in ShellExView und identifizieren Sie die Täter-DLL per binärer Suche.

Autorenprofil

Profilseite des Artikelautors.

Go Komura

Geschäftsführer von KomuraSoft LLC

Spezialisiert auf Windows-Softwareentwicklung, technische Beratung und Fehleranalyse, insbesondere bei bestehenden Systemen und schwer reproduzierbaren Störungen.

Zurück zum Blog